Można użyć bash
rozszerzenia parametru do określenia zakresu, działa to również z parametrami pozycyjnymi. Dla $3
… $n
byłoby to:
"${@:3}" # expands to "$3" "$4" "$5" …
"${*:3}" # expands to "$3 $4 $5 …"
Pamiętaj o tym $@
i $*
zignoruj pierwszy argument $0
. Jeśli zastanawiasz się, którego użyć w twoim przypadku: jest bardzo prawdopodobne, że chcesz otrzymać ofertę $@
. Nie używaj, $*
chyba że wyraźnie nie chcesz, aby argumenty były cytowane indywidualnie.
Możesz to wypróbować w następujący sposób:
$ bash -c 'echo "${@:3}"' 0 1 2 3 4 5 6
3 4 5 6
$ echo 'echo "${@:3}"' >script_file
$ bash script_file 0 1 2 3 4 5 6
2 3 4 5 6
Zauważ, że w pierwszym przykładzie $0
jest wypełniony pierwszym argumentem, 0
podczas gdy gdy jest używany w skrypcie, $0
zamiast tego jest wypełniany nazwą skryptu, jak pokazuje drugi przykład. Nazwa skryptu do bash
oczywiście jest pierwszym argumentem, tylko że to nie zwykle postrzegany jako taki - to samo dotyczy skrypt wykonywalny i nazywa się „bezpośrednio”. Tak więc w pierwszym przykładzie mamy $0
= 0
, $1
= 1
itd., Podczas gdy w drugim jest to $0
= script_file
, $1
= 0
, $2
= 1
itd .; ${@:3}
wybiera każdy argument zaczynający się od $3
.
Kilka dodatkowych przykładów możliwych zakresów:
# two arguments starting with the third
$ bash -c 'echo "${@:3:2}"' 0 1 2 3 4 5 6
3 4
# every argument starting with the second to last one
# a negative value needs either a preceding space or parentheses
$ bash -c 'echo "${@: -2}"' 0 1 2 3 4 5 6
5 6
# two arguments starting with the fifth to last one
$ bash -c 'echo "${@:(-5):2}"' 0 1 2 3 4 5 6
2 3
Dalsza lektura:
shift
podejście uniemożliwi dostęp$1
i$2
po ich przesunięciu. W skrypcie, którego używasz$2
obok$variable_in_question
, musisz to zmienić lub zastosować metodę rozszerzania parametrów.shift
jest dobra, kiedy pierwszy jeden lub więcej argumentów są wyjątkowe i ma to sens, aby odebrać je w oddzielnych zmiennych (foo="$1"; bar="$2";
lubif [[ something with $1 ]];then blah blah; shift
. Ale @ deser za odpowiedź z nieniszczących podejścia jest miła w innych przypadkach, gdy ma nadal chcą pełną listę później lub gdy używasz bardziej zaawansowanej składni do wybierania ograniczonego zakresu argumentów, nie do nieskończoności, bez wprowadzania pustych argumentów do polecenia, jeśli$@
nie ma tak wielu elementówOgólnie rzecz biorąc, możesz skopiować parametry pozycyjne do tablicy, usunąć dowolne indeksy tablicy, a następnie użyć tablicy do rozwinięcia dokładnie tych wskaźników, które chcesz, bez utraty oryginalnych argumentów.
Na przykład, gdybym chciał wszystkich argumentów oprócz pierwszego, czwartego i piątego:
W kopii indeksy są przesunięte o 1, ponieważ
$0
nie jest częścią$@
.źródło
echo "${args[@]:2}"
Dla trzeciego do ostatniego argumentu.