Que signifie $ {@: 2} dans le script shell

Je vois cela dans un script shell.

variable=${@:2} 

Que fait-il?

Commentaires

  • Est-ce exactement ce que cela montre dans le script? La syntaxe ressemble à un tableau mais il manque quelques éléments. Pouvez-vous sil vous plaît poster quelques lignes autour de cette ligne à partir du script?
  • Cest une variable commençant par la deuxième lettre. var="my_value"; echo var="${var[@]:2}"; echo "$var" Voyez la différence?

Réponse

Cest affiche le contenu de la variable spéciale $@, en bash. Elle contient tous les arguments de la ligne de commande, et cette commande prend tous les arguments de la seconde et les stocke dans une variable , variable.

Exemple

Voici un exemple de script.

#!/bin/bash echo ${@:2} variable=${@:3} echo $variable 

Exemple dexécution:

./ex.bash 1 2 3 4 5 2 3 4 5 3 4 5 

Références

Commentaires

  • Notez que la technique montrée écrase les arguments donnés en un seul chaîne de caractères. Si vous devez les conserver en tant quarguments séparés, utilisez un tableau: vars=( "${@:2}" )
  • @glennjackman – merci de lavoir signalé.
  • Aussi notez lutilisation des accolades. Vous êtes censé toujours utiliser des accolades, mais Bash vous permet de les omettre lorsque le contexte est sans ambiguïté. Par conséquent, $@ et ${@} sont identiques, bien que ce dernier soit le " plus correct " syntaxe. Vous devez utiliser les crochets avec ${@:2}, car $@:2 est ambigu et serait donc interprété comme ${@}:2, ce qui nest pas la même chose.

Réponse

Que « sa ksh fonctionnalité également trouvée dans bash et dans les versions récentes de zsh.

Dans ksh et bash, vous pouvez accéder à plusieurs éléments dun tableau en utilisant la syntaxe ${array[@]:first:length}, qui se développe jusquà length (ou tous si length est omis) éléments des array tableau (dans la liste des éléments du tableau triés numériquement sur les index), en commençant par le premier avec un index supérieur ou égal à first. En contexte scalaire (comme ici dans un affectation à une variable scalaire) la liste des éléments est jointe avec un espace ch les caractères avec bash et ksh93 et avec le premier caractère de $IFS (ou rien si $IFS est vide ou espace sil nest pas défini) avec zsh.

Par exemple:

$ a[23]=a a[5]=b a[235]=c a[45]=d $ x=${a[@]:12:2}; printf "<%s>\n" "$x" <a d> 

$@ est un cas particulier. $@ est le tableau des paramètres de position ($1, $2 …). Mais lorsquil est utilisé avec :, $0 est également inclus. Ainsi, ${@:1} est identique à $@, et non ${@:0} comme pour les autres tableaux.

Dans zsh, cest légèrement différent. zsh a ajouté le ksh syntaxe récemment pour la compatibilité mais a sa propre syntaxe pour sélectionner des plages déléments.

Contrairement à ksh et bash, zsh les tableaux sont dun type de variable différent des variables scalaires, ne sont pas clairsemés (zsh a des tableaux associatifs comme autre type de variable) et commencent à lindex 1 au lieu de 0.

Pour zsh, vous accédez aux plages déléments de tableau avec $a[first,last] (où last peut également être négatif pour compter à rebours à partir de la fin).

Dans zsh,

a[23]=a a[5]=b a[235]=c a[45]=d 

crée un tableau avec 235 éléments, la plupart vides. $a[12,50] sétendrait aux éléments 12 à 50, et ${a[@]:12:2} sétendrait uniquement aux (vides) $a[12] et $a[13] éléments. Comme cas particulier, et encore pour la portabilité avec ksh93 et bash, zsh accepte également un 0 premier élément pour $@ et le traite comme $0.

Ainsi, vous pouvez utiliser ${a[@]:x:n} et ${@:x:n} de manière portative sur les 3 shells, mais uniquement pour les tableaux non épars, et faites attention à la valeur dIFS.

Commentaires

  • Merci davoir expliqué la syntaxe dindexation des tableaux

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *