Bash
Skrypty z parametrami
Szukaj…
Uwagi
-
shiftprzesuwa parametry pozycji w lewo, tak że$2$1staje się$1$3$2staje się$2i tak dalej. -
"$@"to tablica wszystkich parametrów pozycyjnych przekazanych do skryptu / funkcji. -
"$*"jest łańcuchem złożonym ze wszystkich parametrów pozycyjnych przekazanych do skryptu / funkcji.
Analiza wielu parametrów
Do analizowania wielu parametrów, preferowanym sposobem osiągnięcia tego celu jest za pomocą pętli while, oświadczenie sprawy oraz zmianę.
shift służy do wyskakiwania pierwszego parametru w szeregu, co dawniej wynosiło 2 USD , a teraz 1 USD . Jest to przydatne do przetwarzania argumentów pojedynczo.
#!/bin/bash
# Load the user defined parameters
while [[ $# > 0 ]]
do
case "$1" in
-a|--valueA)
valA="$2"
shift
;;
-b|--valueB)
valB="$2"
shift
;;
--help|*)
echo "Usage:"
echo " --valueA \"value\""
echo " --valueB \"value\""
echo " --help"
exit 1
;;
esac
shift
done
echo "A: $valA"
echo "B: $valB"
Wejścia i wyjścia
$ ./multipleParams.sh --help
Usage:
--valueA "value"
--valueB "value"
--help
$ ./multipleParams.sh
A:
B:
$ ./multipleParams.sh --valueB 2
A:
B: 2
$ ./multipleParams.sh --valueB 2 --valueA "hello world"
A: hello world
B: 2
Dostęp do parametrów
Podczas wykonywania skryptu Bash parametry przekazywane do skryptu są nazywane zgodnie z ich pozycją: $1 to nazwa pierwszego parametru, $2 to nazwa drugiego parametru i tak dalej.
Brakujący parametr po prostu przekształca się w pusty ciąg. Sprawdzanie istnienia parametru można wykonać w następujący sposób:
if [ -z "$1" ]; then
echo "No argument supplied"
fi
Uzyskiwanie wszystkich parametrów
$@ i $* to sposoby interakcji ze wszystkimi parametrami skryptu. Odwołując się do strony podręcznika użytkownika Bash , widzimy, że:
-
$*: Rozwija się do parametrów pozycyjnych, zaczynając od jednego. Kiedy rozwinięcie występuje w obrębie podwójnych cudzysłowów, rozwija się do pojedynczego słowa z wartością każdego parametru oddzieloną pierwszym znakiem zmiennej specjalnej IFS. -
$@: Rozwija się do parametrów pozycyjnych, zaczynając od jednego. Kiedy rozwinięcie występuje w podwójnych cudzysłowach, każdy parametr rozwija się do osobnego słowa.
Uzyskiwanie liczby parametrów
$# pobiera liczbę parametrów przekazanych do skryptu. Typowym przypadkiem użycia byłoby sprawdzenie, czy przekazano odpowiednią liczbę argumentów:
if [ $# -eq 0 ]; then
echo "No arguments supplied"
fi
Przykład 1
Zapętlaj wszystkie argumenty i sprawdź, czy są to pliki:
for item in "$@"
do
if [[ -f $item ]]; then
echo "$item is a file"
fi
done
Przykład 2
Zapętlaj wszystkie argumenty i sprawdź, czy są to pliki:
for (( i = 1; i <= $#; ++ i ))
do
item=${@:$i:1}
if [[ -f $item ]]; then
echo "$item is a file"
fi
done
Analiza argumentów za pomocą pętli for
Prosty przykład, który zawiera opcje:
| Optować | Alt. Optować | Detale |
|---|---|---|
-h | --help | Pokaż pomoc |
-v | --version | Pokaż informacje o wersji |
-dr path | --doc-root path | Opcja, która pobiera dodatkowy parametr (ścieżkę) |
-i | --install | Opcja boolowska (prawda / fałsz) |
-* | - | Niepoprawna opcja |
#!/bin/bash
dr=''
install=false
skip=false
for op in "$@";do
if $skip;then skip=false;continue;fi
case "$op" in
-v|--version)
echo "$ver_info"
shift
exit 0
;;
-h|--help)
echo "$help"
shift
exit 0
;;
-dr|--doc-root)
shift
if [[ "$1" != "" ]]; then
dr="${1/%\//}"
shift
skip=true
else
echo "E: Arg missing for -dr option"
exit 1
fi
;;
-i|--install)
install=true
shift
;;
-*)
echo "E: Invalid option: $1"
shift
exit 1
;;
esac
done
Skrypt opakowania
Wrapper script to skrypt, który otacza inny skrypt lub polecenie, aby zapewnić dodatkowe funkcje lub po prostu uczynić coś mniej uciążliwym.
Na przykład rzeczywiste egrep w nowym systemie GNU / Linux jest zastępowane przez skrypt otoki o nazwie egrep . Tak to wygląda:
#!/bin/sh
exec grep -E "$@"
Tak więc, kiedy uruchamiasz egrep w takich systemach, faktycznie uruchamiasz grep -E z przekazanymi wszystkimi argumentami.
W ogólnym przypadku, jeśli chcesz uruchomić przykładowy skrypt / polecenie exmp z innym skryptem mexmp skrypt otoki mexmp będzie wyglądał następująco:
#!/bin/sh
exmp "$@" # Add other options before "$@"
# or
#full/path/to/exmp "$@"
Podziel ciąg na tablicę w Bash
Powiedzmy, że mamy parametr String i chcemy go podzielić przecinkiem
my_param="foo,bar,bash"
Aby podzielić ten ciąg przecinkami, możemy użyć;
IFS=',' read -r -a array <<< "$my_param"
W tym przypadku IFS jest specjalną zmienną o nazwie Wewnętrzny separator pól, który definiuje znak lub znaki używane do rozdzielania wzorca na tokeny dla niektórych operacji.
Aby uzyskać dostęp do pojedynczego elementu:
echo "${array[0]}"
Aby iterować po elementach:
for element in "${array[@]}"
do
echo "$element"
done
Aby uzyskać zarówno indeks, jak i wartość:
for index in "${!array[@]}"
do
echo "$index ${array[index]}"
done