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

j'ai un script simple où le premier argument est réservé pour le nom du fichier, et tous les autres arguments optionnels doivent être passés à d'autres parties du script.

en utilisant Google j'ai trouvé ce wiki , mais il a fourni un exemple littéral:

echo "${@: -1}"

je ne peux pas obtenir quoi que ce soit d'autre pour travailler, comme:

echo "${@:2}"

ou

echo "${@:2,1}"

je obtenir "Mauvaise substitution de" de la terminal.

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

317
demandé sur Rob Bednark 2012-01-30 02:31:22

3 réponses

utilisez ceci:

echo "${@:2}"

la syntaxe suivante:

echo "${*:2}"

fonctionnerait aussi bien, mais n'est pas recommandé, parce que comme @Gordon déjà expliqué, qu'en utilisant * , il exécute tous les arguments ensemble comme un seul argument avec des espaces, tandis que @ préserve les ruptures entre eux (même si certains des arguments eux-mêmes contiennent des espaces). Il ne fait pas la différence avec echo , mais cela compte pour beaucoup d'autres commandes.

461
répondu Oliver Charlesworth 2017-05-23 10:31:29

si vous voulez une solution qui fonctionne aussi dans /bin/sh essayer

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

shift [n] déplace les paramètres de position n fois. Un shift définit la valeur de à la valeur , la valeur de à la valeur , et ainsi de suite, la diminution de la valeur de $# par un.

135
répondu Ben Jackson 2017-10-02 15:45:42

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

il explique l'utilisation de shift (si vous voulez rejeter les premiers n Paramètres) et ensuite mettre en œuvre L'utilisation de masse (rechercher le titre avec ce titre).

2
répondu OnlineCop 2012-04-02 23:15:32