Bash
Skrypty z parametrami
Szukaj…
Uwagi
-
shift
przesuwa parametry pozycji w lewo, tak że$2
$1
staje się$1
$3
$2
staje się$2
i 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