Bash
Scripting con parametri
Ricerca…
Osservazioni
-
shift
sposta i parametri posizionali a sinistra in modo che$2
diventi$1
,$3
diventi$2
e così via. -
"$@"
è una matrice di tutti i parametri posizionali passati allo script / funzione. -
"$*"
è una stringa composta da tutti i parametri posizionali passati allo script / funzione.
Analisi dei parametri multipli
Per analizzare molti parametri, il modo migliore per farlo è utilizzare un ciclo while , un'istruzione case e lo shift .
shift
è usato per far scattare il primo parametro della serie, facendo quello che era $ 2 , ora $ 1 . Questo è utile per elaborare gli argomenti uno alla volta.
#!/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"
Ingressi e uscite
$ ./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
Accesso ai parametri
Quando si esegue uno script Bash, i parametri passati nello script vengono denominati in base alla loro posizione: $1
è il nome del primo parametro, $2
è il nome del secondo parametro e così via.
Un parametro mancante valuta semplicemente una stringa vuota. Il controllo dell'esistenza di un parametro può essere eseguito come segue:
if [ -z "$1" ]; then
echo "No argument supplied"
fi
Ottenere tutti i parametri
$@
e $*
sono modi di interagire con tutti i parametri dello script. Facendo riferimento alla pagina man di Bash , vediamo che:
-
$*
: Si espande ai parametri posizionali, a partire da uno. Quando l'espansione avviene tra virgolette doppie, si espande in una singola parola con il valore di ciascun parametro separato dal primo carattere della variabile speciale IFS. -
$@
: Si espande ai parametri posizionali, a partire da uno. Quando l'espansione avviene tra virgolette doppie, ciascun parametro si espande in una parola separata.
Ottenere il numero di parametri
$#
ottiene il numero di parametri passati in uno script. Un tipico caso d'uso sarebbe quello di verificare se il numero appropriato di argomenti è passato:
if [ $# -eq 0 ]; then
echo "No arguments supplied"
fi
Esempio 1
Passa in rassegna tutti gli argomenti e controlla se sono file:
for item in "$@"
do
if [[ -f $item ]]; then
echo "$item is a file"
fi
done
Esempio 2
Passa in rassegna tutti gli argomenti e controlla se sono file:
for (( i = 1; i <= $#; ++ i ))
do
item=${@:$i:1}
if [[ -f $item ]]; then
echo "$item is a file"
fi
done
Analisi degli argomenti usando un ciclo for
Un semplice esempio che fornisce le opzioni:
Optare | Alt. Optare | Dettagli |
---|---|---|
-h | --help | Mostra aiuto |
-v | --version | Mostra informazioni sulla versione |
-dr path | --doc-root path | Un'opzione che accetta un parametro secondario (un percorso) |
-i | --install | Un'opzione booleana (vero / falso) |
-* | - | Opzione non valida |
#!/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
Script wrapper
Lo script wrapper è uno script che include un altro script o comando per fornire funzionalità aggiuntive o semplicemente per rendere meno noioso qualcosa.
Ad esempio, l'attuale egrep
nel nuovo sistema GNU / Linux viene sostituito da uno script wrapper chiamato egrep
. Ecco come appare:
#!/bin/sh
exec grep -E "$@"
Quindi, quando esegui egrep
in tali sistemi, stai eseguendo grep -E
con tutti gli argomenti inoltrati.
Nel caso generale, se si desidera eseguire un esempio di script / comando exmp
con un altro script mexmp
quindi l'involucro mexmp
sceneggiatura sarà simile:
#!/bin/sh
exmp "$@" # Add other options before "$@"
# or
#full/path/to/exmp "$@"
Dividi la stringa in una matrice in Bash
Diciamo che abbiamo un parametro String e vogliamo dividerlo con una virgola
my_param="foo,bar,bash"
Per dividere questa stringa con una virgola possiamo usare;
IFS=',' read -r -a array <<< "$my_param"
Qui, IFS è una variabile speciale denominata Separatore di campo interno che definisce il carattere oi caratteri utilizzati per separare un modello in token per alcune operazioni.
Per accedere a un singolo elemento:
echo "${array[0]}"
Per scorrere gli elementi:
for element in "${array[@]}"
do
echo "$element"
done
Per ottenere sia l'indice che il valore:
for index in "${!array[@]}"
do
echo "$index ${array[index]}"
done