Bash: tranche de paramètres positionnels

20

Comment puis-je obtenir une tranche de $@dans Bash sans avoir d'abord à copier tous les paramètres de position dans un autre tableau comme celui-ci?

argv=( "$@" )
echo "${argv[@]:2}";
nr
la source
1
Toujours citer "$@". Votre argvaffectation serait rompue si des arguments contenaient des espaces.
jordanm

Réponses:

31

Vous pouvez utiliser le même format que pour tout autre tableau. Pour extraire les 2e et 3e éléments de $@, vous feriez:

echo "${@:1:2}"
          - -
          | |----> slice length
          |------> slice starting index 
terdon
la source
1
Mais cela semble fonctionner au cas par cas dans la version 4.1.2, existe-t-il un moyen de le faire mot par mot?
Alexej Magura
@AlexejMagura Je ne comprends pas ce que tu veux dire. Cela agit sur les éléments du tableau. Si vous avez des éléments à un caractère, cela fonctionnera "sur les personnages". Si chaque élément est un mot, cela fonctionne sur les mots. Essayez-vous peut-être cela sur une chaîne et non sur un tableau?
terdon
Je suis en train de l'essayer sur une copie de "$ @", qui, je suppose, pourrait devenir une chaîne à ce stade, je ne suis pas sûr.
Alexej Magura
Sur bash 4.2.46, "${@:1:2}"me donne en fait les arguments de 1ère et 2ème ligne de commande . Pendant ce temps, "${@:1}"me donne les arguments de ligne de commande complets et "${@:0}"me donne le nom du script suivi des arguments de ligne de commande complets .
Rockallite
@Rockallite bien, oui. Les 2e et 3e éléments du $@ tableau sont les 1er et 2e arguments. "${@:1}"affichera le tableau entier en commençant par le 2ème élément (le 1er argument) et ${@:0}le tableau entier en partant du 1er élément qui est le nom du script. À quoi vous attendiez-vous?
terdon