Je vois cela dans un script shell.
variable=${@:2}
Que fait-il?
Commentaires
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
var="my_value"; echo var="${var[@]:2}"; echo "$var"
Voyez la différence?