Risposte:
Il comando di shell e qualsiasi argomento a quel comando apparire come numerati variabili di shell: $0ha il valore di stringa del comando stesso, qualcosa di simile script, ./script, /home/user/bin/scripto 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 getoptse shift. getoptsè molto simile alla getopt()funzione della libreria C. shiftsposta il valore di $2to $1, $3to $2e così via; $#viene diminuito. Il codice finisce per esaminare il valore di "$1", fare le cose usando un case... esacper decidere un'azione, e poi fare una shiftper passare $1all'argomento successivo. Deve solo esaminare $1, e forse $#.
È possibile accedere agli argomenti passati con $ndove si ntrova 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 $1per il primo argomento e $2per 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 ... esactestamento è 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'getopteseguibile non è lo stesso su distro / piattaforma. Sono un utente ora completamente convertitogetopts, in quanto è uno standard POSIX. Funziona benissimodashanche con questa , che è la mia shell di script preferita