Passer des paramètres de ligne de commande à un programme à l'intérieur du script shell

15

En ce qui concerne ./script.sh arg1 [arg2 arg3 ...], les arguments de ligne de commande arg1, arg2... peut être obtenu par $1, $2... Mais le nombre d'arguments est pas fixé.

Dans le script shell, je veux passer les arguments à partir arg2d'un programme,

#/bin/bash
...
/path/to/a/program [I want to pass arg2 arg3 ... to the program]
...

Comment pourrais-je le faire car il pourrait y avoir un ou plusieurs arguments?

Lee
la source

Réponses:

17

La manière habituelle serait d'enregistrer une copie de arg1 ( "$1") et de déplacer les paramètres de un, de sorte que vous pouvez vous référer à la liste entière comme "$@":

#!/bin/sh
arg1="$1"
shift 1
/path/to/a/program "$@"

bash a un certain support de tableau bien sûr, mais il n'est pas nécessaire pour la question posée.

Si même arg1 est facultatif, vous devriez le vérifier comme ceci:

if [ $# != 0 ]
then
    arg1="$1"
    shift 1
fi
Thomas Dickey
la source
Les guillemets doubles sont-ils nécessaires lors de l'utilisation $@?
Lee
1
Les guillemets doubles $@indiquent au shell de citer deux fois chaque paramètre (quelque chose de bien à faire si les paramètres contiennent des caractères intéressants tels que des parenthèses ou des astérisques). Si vous ne vous souciez pas de cela, une plaine $*fonctionne ...
Thomas Dickey
6
@Lee Oui, les guillemets doubles sont nécessaires. Sinon, au lieu de passer par la liste des arguments, chaque argument est divisé en espaces blancs, puis chaque morceau est interprété comme un motif générique et, si le motif correspond, il est remplacé par la liste des correspondances. En règle générale, toujours remplacer les variables par des guillemets doubles .
Gilles 'SO- arrête d'être méchant'
10

Vous pouvez découper les paramètres positionnels en utilisant l'expansion des paramètres. La syntaxe est:

${parameter:offset:length}

Si lengthest omis, il est pris jusqu'à la dernière valeur.

Comme vous deviez passer de l'avant-dernier argument, vous avez besoin de:

${@:2}

Exemple:

$ foo() { echo "${@:2}" ;}

$ foo bar spam egg
spam egg
heemayl
la source