Que signifie ce $ {@: 2} dans les scripts shell

27

Je vois cela dans un script shell.

variable=${@:2}

Qu'est-ce que ça fait?

Lénine Raj Rajasekaran
la source
Est-ce exactement comme cela a été montré dans le script? La syntaxe ressemble à un tableau mais il manque quelques morceaux. Pouvez-vous s'il vous plaît poster quelques lignes autour de cette ligne du script?
slm
Il s'agit d'une variable à partir de la deuxième lettre. var="my_value"; echo var="${var[@]:2}"; echo "$var"Regarde la différence?
Valentin Bajrami

Réponses:

34

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.

Exemple

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

Les références

slm
la source
9
Notez que la technique présentée écrase les arguments donnés dans une seule chaîne. Si vous devez les conserver en tant qu'arguments séparés, utilisez un tableau:vars=( "${@:2}" )
glenn jackman
@glennjackman - merci de l'avoir signalé.
slm
2
Notez également l'utilisation des accolades. Vous êtes censé toujours utiliser des accolades, mais Bash vous permet de les omettre lorsque le contexte n'est pas ambigu. Par conséquent, $@et ${@}sont identiques, bien que cette dernière soit la syntaxe "la plus correcte". Vous devez utiliser les crochets avec ${@:2}, car $@:2est ambigu et serait donc interprété comme ${@}:2, ce qui n'est pas la même chose.
Paddy Landau
14

C'est une kshfonctionnalité également présente dans bashles versions récentes de zsh.

Dans kshet 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 lengthest omis) des éléments du arraytableau (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 bashet ksh93et avec le premier caractère de $IFS(ou rien si $IFSest 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 :, $0est é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 zshajouté la kshsyntaxe que récemment pour des raisons de compatibilité, mais possède sa propre syntaxe pour sélectionner des plages d'éléments.

Contrairement à kshet bash, les zshtableaux sont un type de variable différent des variables scalaires, ne sont pas rares ( zsha 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ù lastpeut é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 ksh93et bash, zshaccepte également un 0premier é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.

Stéphane Chazelas
la source