Risposte:
Il comando di shell e qualsiasi argomento a quel comando apparire come numerati variabili di shell: $0
ha il valore di stringa del comando stesso, qualcosa di simile script
, ./script
, /home/user/bin/script
o qualsiasi altra cosa. Qualsiasi argomento appaiono come "$1"
, "$2"
, "$3"
e così via. Il conteggio degli argomenti è nella variabile shell "$#"
.
Modi comuni di gestione di questo includono comandi shell getopts
e shift
. getopts
è molto simile alla getopt()
funzione della libreria C. shift
sposta il valore di $2
to $1
, $3
to $2
e così via; $#
viene diminuito. Il codice finisce per esaminare il valore di "$1"
, fare le cose usando un case
... esac
per decidere un'azione, e poi fare una shift
per passare $1
all'argomento successivo. Deve solo esaminare $1
, e forse $#
.
È possibile accedere agli argomenti passati con $n
dove si n
trova il numero dell'argomento - 1, 2, 3, ...
. Passi gli argomenti proprio come faresti con qualsiasi altro comando.
$ cat myscript
#!/bin/bash
echo "First arg: $1"
echo "Second arg: $2"
$ ./myscript hello world
First arg: hello
Second arg: world
$/shellscriptname.sh argument1 argument2 argument3
È inoltre possibile passare l'output di uno script di shell come argomento a un altro script di shell.
$/shellscriptname.sh "$(secondshellscriptname.sh)"
All'interno dello script della shell è possibile accedere agli argomenti con numeri come $1
per il primo argomento e $2
per il secondo argomento e così via.
Il modulo
$ ./script.sh "$@"
è il più conveniente per argv
. Il delimitatore arg è uno spazio bianco, ma può essere modificato. Non ricordare quanto off-hand. Quindi utilizzare
$1, $2, shift, if [ $# -ne 3 ]
per controllare il flusso. Di solito non abbraccio getopts se un case ... esac
testamento è sufficiente.
Su uno script bash, personalmente mi piace usare il seguente script per impostare i parametri:
#!/bin/bash
helpFunction()
{
echo ""
echo "Usage: $0 -a parameterA -b parameterB -c parameterC"
echo -e "\t-a Description of what is parameterA"
echo -e "\t-b Description of what is parameterB"
echo -e "\t-c Description of what is parameterC"
exit 1 # Exit script after printing help
}
while getopts "a:b:c:" opt
do
case "$opt" in
a ) parameterA="$OPTARG" ;;
b ) parameterB="$OPTARG" ;;
c ) parameterC="$OPTARG" ;;
? ) helpFunction ;; # Print helpFunction in case parameter is non-existent
esac
done
# Print helpFunction in case parameters are empty
if [ -z "$parameterA" ] || [ -z "$parameterB" ] || [ -z "$parameterC" ]
then
echo "Some or all of the parameters are empty";
helpFunction
fi
# Begin script in case all parameters are correct
echo "$parameterA"
echo "$parameterB"
echo "$parameterC"
Con questa struttura, non facciamo affidamento sull'ordine dei parametri, poiché stiamo definendo una lettera chiave per ognuno di essi. Inoltre, la funzione di aiuto verrà stampata tutte le volte che i parametri sono definiti in modo errato. È molto utile quando abbiamo molti script con parametri diversi da gestire. Funziona come il seguente:
$ ./myscript -a "String A" -b "String B" -c "String C"
String A
String B
String C
$ ./myscript -a "String A" -c "String C" -b "String B"
String A
String B
String C
$ ./myscript -a "String A" -c "String C" -f "Non-existent parameter"
./myscript: illegal option -- f
Usage: ./myscript -a parameterA -b parameterB -c parameterC
-a Description of what is parameterA
-b Description of what is parameterB
-c Description of what is parameterC
$ ./myscript -a "String A" -c "String C"
Some or all of the parameters are empty
Usage: ./myscript -a parameterA -b parameterB -c parameterC
-a Description of what is parameterA
-b Description of what is parameterB
-c Description of what is parameterC
Nella shell script; diventa il nome della variabile $ 1. La seconda parola diventa il nome della variabile $ 2 e così via.
cat << 'EOF' > test
echo "First arg: $1"
echo "Second arg: $2"
echo "List of all arg: $@"
EOF
sh test hello world
Altre informazioni potrebbero essere trovate nel manuale della shell (sh) su http://heirloom.sourceforge.net/sh/sh.1.html
Se hai familiarità con Python argparse e non ti dispiace chiamare python per analizzare gli argomenti bash, usa bash argparse ( https://github.com/mattbryson/bash-arg-parse ),
Vedi la stessa risposta qui: https://stackoverflow.com/questions/7069682/how-to-get-arguments-with-flags-in-bash-script/50181287#50181287
#!/bin/bash
echo "First arg: $1"
echo "Second arg: $2"
echo "Your First Argument was $1 & Second Argument was $2" 2> /dev/null
------------------------------------------------------------------------
./scriptname.sh value1 value2
2> /dev/null
, 2) non aggiunge nulla alle risposte esistenti.
getopt()
è uno standard estremamente consolidato, ma l'getopt
eseguibile non è lo stesso su distro / piattaforma. Sono un utente ora completamente convertitogetopts
, in quanto è uno standard POSIX. Funziona benissimodash
anche con questa , che è la mia shell di script preferita