W moim skrypcie bash chciałbym przeanalizować zero, jeden lub dwa parametry (skrypt może je rozpoznać), a następnie przekazać pozostałe parametry do polecenia wywołanego w skrypcie. Jak mogę to zrobić?
W moim skrypcie bash chciałbym przeanalizować zero, jeden lub dwa parametry (skrypt może je rozpoznać), a następnie przekazać pozostałe parametry do polecenia wywołanego w skrypcie. Jak mogę to zrobić?
Odpowiedzi:
Użyj shift
wbudowanego polecenia, aby „zjeść” argumenty. Następnie wywołaj proces potomny i przekaż mu "$@"
argument, aby uwzględnić wszystkie pozostałe argumenty. Zwróć uwagę na cudzysłowy, należy je zachować, ponieważ powodują one rozszerzenie listy argumentów, aby były prawidłowo cytowane.
$@
zasadniczo traktuje każdy element tablicy jako ciąg znaków w cudzysłowie - są one przekazywane bez możliwości rozwinięcia. Zapewnia również, że każde z nich jest postrzegane jako osobne słowo. To wyjaśnienie wraz ze skryptem testowym demonstrującym różnicę jest tutaj: tldp.org/LDP/abs/html/internalvariables.html#APPREF
bash używa polecenia shift :
np. shifttest.sh:
#!/bin/bash
echo $1
shift
echo $1 $2
shifttest.sh 1 2 3 produkuje
1
2 3
$1
bez cytowania ich jako "$1"
, to powłoka dokona podziału na słowa, więc np. foo bar
Zostanie przekazana oddzielnie jako foo
i bar
.
Bash obsługuje podzbiory parametrów (zobacz Podzbiory i podciągi ), więc możesz wybrać, które parametry mają być przetwarzane / przekazywane w ten sposób.
otwórz nowy plik i edytuj go: vim r.sh
:
echo "params only 2 : ${@:2:1}"
echo "params 2 and 3 : ${@:2:2}"
echo "params all from 2: ${@:2:99}"
echo "params all from 2: ${@:2}"
Uruchom:
$ chmod u+x r.sh
$ ./r.sh 1 2 3 4 5 6 7 8 9 10
wynik to:
params only 2 : 2
params 2 and 3 : 2 3
params all from 2: 2 3 4 5 6 7 8 9 10
params all from 2: 2 3 4 5 6 7 8 9 10