Come posso passare un argomento della riga di comando in uno script di shell?


243

So che gli script di shell eseguono i comandi come se fossero stati eseguiti al prompt dei comandi. Mi piacerebbe poter eseguire script di shell come se fossero funzioni ... Cioè, prendere un valore di input o una stringa nello script. Come posso avvicinarmi a questo?

Risposte:


199

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 $#.


6
la C getopt()è uno standard estremamente consolidato, ma l' getopteseguibile non è lo stesso su distro / piattaforma. Sono un utente ora completamente convertito getopts, in quanto è uno standard POSIX. Funziona benissimo dashanche con questa , che è la mia shell di script preferita
JM Becker,

165

È 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

27
$/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.

Altro su argomenti di shell


18

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.


14

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

13
./myscript myargument

myargumentdiventa $1dentro myscript.


5

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


2
benvenuto in U&L, questo non aggiunge quasi nulla alla risposta già fornita.
Archemar,


0
#!/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

3
1) non necessario 2> /dev/null, 2) non aggiunge nulla alle risposte esistenti.
xenoide,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.