Comment puis-je passer un argument de ligne de commande dans un script shell?

243

Je sais que les scripts de shell exécutent des commandes comme si elles étaient exécutées à l'invite de commande. J'aimerais pouvoir exécuter des scripts de shell comme s'il s'agissait de fonctions ... C'est-à-dire prendre une valeur d'entrée ou une chaîne dans le script. Comment puis-je aborder cela?

Paul
la source

Réponses:

199

La commande shell et des arguments à cette commande apparaissent comme numérotées variables shell: $0a la valeur de chaîne de la commande elle - même, quelque chose comme script, ./script, /home/user/bin/scriptou autre chose. Tous les arguments apparaissent comme "$1", "$2", "$3"et ainsi de suite. Le nombre d'arguments est dans la variable shell "$#".

Les moyens habituels de gérer cela impliquent des commandes shell getoptset shift. getoptsressemble beaucoup à la getopt()fonction de bibliothèque C. shiftdéplace la valeur de $2to $1, $3to $2, etc. $#se décrémente. Le code finit par regarder la valeur de "$1", faire les choses en utilisant un caseesacpour décider d'une action, puis en faisant shiftpasser $1à l'argument suivant. Il n’ya qu’à examiner $1, et peut-être $#.

Bruce Ediger
la source
6
C getopt()est un standard extrêmement bien établi, mais l’ getoptexécutable n’est pas le même d’une distribution à l’autre. Je suis maintenant un getoptsutilisateur entièrement converti , car il s'agit d'un standard POSIX. Cela fonctionne très bien dashaussi, qui est mon shell de script préféré
JM Becker
165

Vous pouvez accéder aux arguments passés avec $nnest le numéro de l'argument - 1, 2, 3, .... Vous transmettez les arguments comme vous le feriez avec n'importe quelle autre commande.

$ cat myscript
#!/bin/bash
echo "First arg: $1"
echo "Second arg: $2"
$ ./myscript hello world
First arg: hello
Second arg: world
Kevin
la source
27
$/shellscriptname.sh argument1 argument2 argument3 

Vous pouvez également transmettre la sortie d'un script shell en tant qu'argument à un autre script shell.

$/shellscriptname.sh "$(secondshellscriptname.sh)"

Dans un script shell, vous pouvez accéder aux arguments avec des nombres comme $1pour le premier argument et $2pour le second argument, etc.

Plus sur les arguments du shell

Balaswamy Vaddeman
la source
18

La forme

$ ./script.sh "$@" 

est le plus pratique pour argv. Le délimiteur arg est un espace, mais peut être modifié. Je ne me souviens pas à quel point Puis utiliser

 $1, $2, shift, if [ $# -ne 3 ] 

pour contrôler le flux. Je n'embrasse généralement pas getopts si case ... esaccela suffit.

utilisateur400344
la source
14

Sur un script bash, j'aime personnellement utiliser le script suivant pour définir les paramètres:

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

Avec cette structure, nous ne dépendons pas de l'ordre des paramètres, car nous définissons une lettre clé pour chacun d'eux. De plus, la fonction d’aide sera imprimée toutes les fois où les paramètres sont définis de manière erronée. C'est très utile lorsque nous avons beaucoup de scripts avec différents paramètres à gérer. Cela fonctionne comme suit:

$ ./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
Rafael Muynarsk
la source
13
./myscript myargument

myargumentdevient à l' $1intérieur myscript.

Vimdude
la source
5

Dans le script shell; il devient le nom de variable $ 1. Le deuxième mot devient le nom de variable $ 2 et ainsi de suite.

cat << 'EOF' > test
echo "First arg: $1"
echo "Second arg: $2"
echo "List of all arg: $@"
EOF
sh test hello world

Plus peut-être trouvé dans le shell (sh) manual à http://heirloom.sourceforge.net/sh/sh.1.html

Feu dans le ciel
la source
2
bienvenue à U & L, cela n’ajoute rien à la réponse déjà donnée.
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
Yogesh
la source
3
1) inutile 2> /dev/null, 2) n'ajoute rien aux réponses existantes.
xénoïde le