166 votes

Supprimer le premier élément de $@ en bash

Je suis en train d'écrire un script bash qui a besoin de faire une boucle sur les arguments passés dans le script. Toutefois, le premier argument ne devrait pas être passée en boucle, et au lieu de cela doit être vérifié avant la boucle.

Si je n'avais pas pour supprimer le premier élément que je pouvais juste faire:

for item in "$@" ; do
  #process item
done

Je pourrais modifier la boucle pour vérifier si il est dans sa première itération et de modifier le comportement, mais qui semble trop hackish. Il y a un moyen simple pour extraire le premier argument, puis une boucle sur le reste, mais je n'étais pas capable de le trouver.

185voto

Amber Points 159296

Utiliser shift?

http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_09_07.html

Fondamentalement, lire $1 pour le premier argument avant la boucle (ou $0 si ce que vous êtes désireux de le vérifier est le nom du script), puis utilisez shift, puis la boucle sur le reste de la $@.

171voto

Dennis Williamson Points 105818

Une autre variante utilise la matrice de découpage:

for item in "${@:2}"
do
    process "$item"
done

Cela peut être utile si, pour une raison quelconque, vous vouliez quitter les arguments mis en place depuis shift est destructeur.

62voto

nos Points 102226
fistitem=$1
shift;
for item in "$@" ; do
  #process item
done

6voto

James Andino Points 3272
q=${@:0:1};[ ${2} ] && set ${@:2} || set ""; echo $q

MODIFIER

> q=${@:1}
# gives the first element of the special parameter array ${@}; but ${@} is unusual in that it contains (? file name or something ) and you must use an offset of 1;

> [ ${2} ] 
# checks that ${2} exists ; again ${@} offset by 1
    > && 
    # are elements left in        ${@}
      > set ${@:2}
      # sets parameter value to   ${@} offset by 1
    > ||
    #or are not elements left in  ${@}
      > set ""; 
      # sets parameter value to nothing

> echo $q
# contains the popped element

Un Exemple de pop avec tableau normal

   LIST=( one two three )
    ELEMENT=( ${LIST[@]:0:1} );LIST=( "${LIST[@]:1}" ) 
    echo $ELEMENT

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X