Bash
Skript med parametrar
Sök…
Anmärkningar
-
shift
flyttar positionsparametrarna till vänster så att$2
blir$1
,$3
blir$2
och så vidare. -
"$@"
är en matris med alla positionsparametrar som skickas till skriptet / funktionen. -
"$*"
är en sträng som består av alla positionsparametrar som skickas till skriptet / funktionen.
Analys av flera parametrar
Att tolka massor av parametrar är det föredragna sättet att göra detta med hjälp av en while-slinga, ett fall uttalande och skift.
shift
används för att visa den första parametern i serien, vilket gör vad som brukade vara $ 2 , nu till $ 1 . Detta är användbart för att behandla argument en i taget.
#!/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"
Ingångar och utgångar
$ ./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
Åtkomst till parametrar
När du kör ett Bash-skript namnges parametrar som skickas in i skriptet i enlighet med deras position: $1
är namnet på den första parametern, $2
är namnet på den andra parametern och så vidare.
En saknad parameter utvärderar helt enkelt till en tom sträng. Kontroll av förekomsten av en parameter kan göras enligt följande:
if [ -z "$1" ]; then
echo "No argument supplied"
fi
Få alla parametrar
$@
och $*
är sätt att interagera med alla skriptparametrar. Med hänvisning till Bash man-sidan ser vi att:
-
$*
: Expanderar till positionsparametrarna, med start från en. När utvidgningen sker inom dubbla citat expanderar den till ett enda ord med värdet på varje parameter separerad med det första tecknet i IFS specialvariabel. -
$@
: Expanderar till positionsparametrarna med början från en. När expansionen sker inom dubbla citat expanderas varje parameter till ett separat ord.
Få antal parametrar
$#
får antalet parametrar som skickas till ett skript. Ett typiskt användningsfall skulle vara att kontrollera om lämpligt antal argument har skickats:
if [ $# -eq 0 ]; then
echo "No arguments supplied"
fi
Exempel 1
Gå igenom alla argument och kontrollera om det är filer:
for item in "$@"
do
if [[ -f $item ]]; then
echo "$item is a file"
fi
done
Exempel 2
Gå igenom alla argument och kontrollera om det är filer:
for (( i = 1; i <= $#; ++ i ))
do
item=${@:$i:1}
if [[ -f $item ]]; then
echo "$item is a file"
fi
done
Tolkning av argument med en för-loop
Ett enkelt exempel som ger alternativen:
Välja | Alt. Välja | detaljer |
---|---|---|
-h | --help | Visa hjälp |
-v | --version | Visa versioninformation |
-dr path | --doc-root path | Ett alternativ som tar en sekundär parameter (en sökväg) |
-i | --install | Ett booleskt alternativ (sant / falskt) |
-* | - | Ogiltigt alternativ |
#!/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
Inpackningsmanus
Wrapper-skript är ett skript som slår in ett annat skript eller kommando för att ge extra funktioner eller bara för att göra något mindre tråkigt.
Exempelvis egrep
den faktiska egrep
i nya GNU / Linux-system av ett omslagsskript som heter egrep
. Så här ser det ut:
#!/bin/sh
exec grep -E "$@"
Så när du kör egrep
i sådana system kör du faktiskt grep -E
med alla argument som vidarebefordras.
I allmänhet, om du vill köra ett exempel på en skript / kommando- exmp
med ett annat skript mexmp
så kommer wrapper mexmp
skriptet att se ut:
#!/bin/sh
exmp "$@" # Add other options before "$@"
# or
#full/path/to/exmp "$@"
Dela strängen i en matris i Bash
Låt oss säga att vi har en strängparameter och vi vill dela den med komma
my_param="foo,bar,bash"
För att dela den här strängen med komma kan vi använda;
IFS=',' read -r -a array <<< "$my_param"
Här är IFS en speciell variabel som kallas Intern fältavskiljare som definierar tecknet eller tecknen som används för att separera ett mönster till tokens för vissa operationer.
För att komma åt ett enskilt element:
echo "${array[0]}"
För att upprepa elementen:
for element in "${array[@]}"
do
echo "$element"
done
För att få både index och värde:
for index in "${!array[@]}"
do
echo "$index ${array[index]}"
done