¿Qué significa este $ {@: 2} en las secuencias de comandos de shell

27

Veo esto en un script de shell.

variable=${@:2}

¿Qué está haciendo?

Lenin Raj Rajasekaran
fuente
¿Es exactamente así como se mostró en el guión? La sintaxis parece una matriz pero le faltan algunas piezas. ¿Puedes publicar un par de líneas alrededor de esta línea del guión?
slm
Esa es una variable a partir de la segunda letra. var="my_value"; echo var="${var[@]:2}"; echo "$var"¿Ver la diferencia?
Valentin Bajrami

Respuestas:

34

Muestra el contenido de la variable especial $@, en Bash. Contiene todos los argumentos de línea de comandos, y este comando está tomando todos los argumentos de la segunda sobre y almacenarlos en una variable, variable.

Ejemplo

Aquí hay un script de examen.

#!/bin/bash

echo ${@:2}

variable=${@:3}
echo $variable

Ejemplo de ejecución:

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

Referencias

slm
fuente
99
Tenga en cuenta que la técnica mostrada combina los argumentos dados en una sola cadena. Si necesita mantenerlos como argumentos separados, use una matriz:vars=( "${@:2}" )
glenn jackman
@glennjackman: gracias por señalarlo.
slm
2
También tenga en cuenta el uso de las llaves. Se supone que siempre debe usar llaves, pero Bash le permite omitirlas cuando el contexto no es ambiguo. Por lo tanto, $@y ${@}son idénticos, aunque este último es la sintaxis "más correcta". Debe usar los corchetes con ${@:2}, porque $@:2es ambiguo y, por lo tanto, se interpretaría como ${@}:2, lo que no es lo mismo.
Paddy Landau
14

Esa es una kshcaracterística que también se encuentra en bashy versiones recientes de zsh.

En kshy bash, puede acceder a varios elementos de una matriz mediante el uso de la ${array[@]:first:length}sintaxis, que se expande hasta length(o lengthse omite) elementos de la arraymatriz (en la lista de elementos de la matriz ordenados numéricamente en los índices), comenzando con el primero con índice mayor o igual a first. Cuando está en contexto escalar (como aquí en una asignación a una variable escalar), la lista de elementos se une con caracteres de espacio con bashy ksh93y con el primer carácter de $IFS(o nada si $IFSestá vacío o espacio si no está configurado) con zsh.

Por ejemplo:

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

$@Es un caso especial. $@es la matriz de parámetros posicionales ( $1, $2...). Pero cuando se usa con :, $0también está incluido. Entonces ${@:1}es lo mismo que $@, no ${@:0}como para otras matrices.

En zsh, es un poco diferente. zshagregó la kshsintaxis solo recientemente por compatibilidad, pero tiene su propia sintaxis para seleccionar rangos de elementos.

Contrariamente a kshy bash, las zshmatrices son un tipo de variable diferente de las variables escalares, no son dispersas ( zshtiene matrices asociativas como otro tipo de variable) y comienzan en el índice 1 en lugar de 0.

Para zshacceder a los rangos de elementos de matriz con $a[first,last](donde lasttambién puede ser negativo contar hacia atrás desde el final).

en zsh,

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

crea una matriz con 235 elementos, la mayoría de ellos vacíos. $a[12,50]se expandiría a los elementos 12 a 50, y ${a[@]:12:2}solo se expandiría a los elementos (vacío) $a[12]y $a[13]. Como un caso especial, y nuevamente para la portabilidad con ksh93y bash, zshtambién acepta un 0primer elemento $@y lo trata como tal $0.

Por lo tanto, se puede utilizar ${a[@]:x:n}y ${@:x:n}portable a través de los 3 conchas, pero sólo para las matrices no escaso, y prestar atención al valor de IFS.

Stéphane Chazelas
fuente