Je vois cela dans un script shell.
variable=${@:2}
Qu'est-ce que ça fait?
var="my_value"; echo var="${var[@]:2}"; echo "$var"
Regarde la différence?
Je vois cela dans un script shell.
variable=${@:2}
Qu'est-ce que ça fait?
var="my_value"; echo var="${var[@]:2}"; echo "$var"
Regarde la différence?
Réponses:
Il montre le contenu de la variable spéciale $@
, dans Bash. Elle contient tous les arguments de ligne de commande, et cette commande prend tous les arguments de l'autre sur et en les stockant dans une variable, variable
.
Voici un script exampe.
#!/bin/bash
echo ${@:2}
variable=${@:3}
echo $variable
Exemple d'exécution:
./ex.bash 1 2 3 4 5
2 3 4 5
3 4 5
vars=( "${@:2}" )
$@
et ${@}
sont identiques, bien que cette dernière soit la syntaxe "la plus correcte". Vous devez utiliser les crochets avec ${@:2}
, car $@:2
est ambigu et serait donc interprété comme ${@}:2
, ce qui n'est pas la même chose.
C'est une ksh
fonctionnalité également présente dans bash
les versions récentes de zsh
.
Dans ksh
et bash
, vous pouvez accéder à plusieurs éléments d'un tableau à l'aide de la ${array[@]:first:length}
syntaxe, qui s'étend jusqu'à length
(ou tous si length
est omis) des éléments du 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 indice supérieur ou égal à first
. En contexte scalaire (comme ici dans une affectation à une variable scalaire), la liste des éléments est jointe avec des caractères d'espace avec bash
et ksh93
et avec le premier caractère de $IFS
(ou rien si $IFS
est vide ou espace s'il n'est 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 de paramètres positionnels ( $1
, $2
...). Mais lorsqu'il est utilisé avec :
, $0
est également inclus. C'est ${@:1}
la même chose que $@
, pas ${@:0}
comme pour les autres tableaux.
En zsh
, c'est légèrement différent. n'a zsh
ajouté la ksh
syntaxe que récemment pour des raisons de compatibilité, mais possède sa propre syntaxe pour sélectionner des plages d'éléments.
Contrairement à ksh
et bash
, les zsh
tableaux sont un type de variable différent des variables scalaires, ne sont pas rares ( zsh
a des tableaux associatifs comme un autre type de variable) et commencent à l'index 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 en arrière à 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 d'entre eux vides. $a[12,50]
s'étendrait aux éléments 12 à 50 et ${a[@]:12:2}
ne s'étendrait qu'aux éléments (vide) $a[12]
et $a[13]
. Comme cas spécial, 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}
porter sur les 3 shells, mais uniquement pour les tableaux non clairsemés, et faire attention à la valeur d'IFS.