web-dev-qa-db-fra.com

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

Pour ce qui est de ./script.sh arg1 [arg2 arg3 ...], les arguments de la ligne de commande arg1, arg2, ... peut être obtenu par $1, $2, ... Mais le nombre d'arguments est PAS fixe.

Dans le script Shell, je veux passer les arguments à partir de arg2 à 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?

16
Lee

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

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

bash a un 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
18
Thomas Dickey

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

${parameter:offset:length}

Si length est omis, il est pris comme 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
10
heemayl