web-dev-qa-db-fra.com

Traite tous les arguments sauf le premier (dans un script bash)

J'ai un script simple dans lequel le premier argument est réservé au nom de fichier et tous les autres arguments facultatifs doivent être transmis à d'autres parties du script.

En utilisant Google, j'ai trouvé ce wiki , mais il fournit un exemple littéral:

echo "${@: -1}"

Je ne peux rien faire d’autre, comme:

echo "${@:2}"

ou

echo "${@:2,1}"

Je reçois une "mauvaise substitution" du terminal.

Quel est le problème et comment puis-je traiter tout sauf le premier argument transmis à un script bash?

381
theta

Utilisez ceci:

echo "${@:2}"

La syntaxe suivante:

echo "${*:2}"

fonctionnerait aussi bien, mais n’est pas recommandé, car @ Gordon déjà expliqué que, si on utilise *, tous les arguments sont exécutés ensemble en tant qu’argument unique avec des espaces, tandis que @ préserve les séparations entre elles (même si certains des arguments contiennent des espaces). Cela ne fait pas la différence avec echo, mais cela compte pour beaucoup d'autres commandes.

561
Oliver Charlesworth

Si vous voulez une solution qui fonctionne aussi dans /bin/sh essayez

first_arg="$1"
shift
echo First argument: "$first_arg"
echo Remaining arguments: "$@"

shift [n] décale les paramètres de position n fois. A shift définit la valeur de $1 sur la valeur de $2, la valeur de $2 sur la valeur de $3, etc., en diminuant la valeur. de $# par un.

159
Ben Jackson

http://wiki.bash-hackers.org/scripting/posparams

Il explique l'utilisation de shift (si vous souhaitez supprimer les N premiers paramètres), puis implémentation de Mass Usage

4
OnlineCop