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

Veo esto en una secuencia de comandos de shell.

variable=${@:2} 

¿Qué está haciendo?

Comentarios

  • ¿Es exactamente así como se muestra en el script? La sintaxis parece una matriz, pero le faltan algunas piezas. ¿Puede publicar un par de líneas alrededor de esta línea del script?
  • Esa es una variable que comienza desde la segunda letra. var="my_value"; echo var="${var[@]:2}"; echo "$var" ¿Ves la diferencia?

Responder

It «s mostrando el contenido de la variable especial $@, en Bash. Contiene todos los argumentos de la línea de comando, y este comando toma todos los argumentos del segundo en adelante y los almacena en una variable , variable.

Ejemplo

Aquí hay un script de ejemplo.

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

Ejecución de ejemplo:

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

Referencias

Comentarios

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

Responder

Eso es «sa ksh característica también se encuentra en bash y versiones recientes de zsh.

En ksh y bash, puede acceder a varios elementos de una matriz mediante la ${array[@]:first:length} sintaxis, que se expande hasta length (o todo si se omite length) elementos de array matriz (en la lista de elementos de la matriz ordenados numéricamente en los índices), comenzando con el primero con un índice mayor o igual a first. Cuando en contexto escalar (como aquí en un asignación a una variable escalar) la lista de elementos se une con el espacio ch caracteres con bash y ksh93 y con el primer carácter de $IFS (o nada si $IFS está vacío o en un 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 :, también se incluye $0. Entonces ${@:1} es lo mismo que $@, no ${@:0} como para otras matrices.

En zsh, es un poco diferente. zsh agregó el ksh sintaxis recientemente para compatibilidad, pero tiene su propia sintaxis para seleccionar rangos de elementos.

Al contrario de ksh y bash, zsh las matrices son un tipo de variable diferente de las variables escalares, no son dispersas (zsh tiene matrices asociativas como otro tipo de variable) en el índice 1 en lugar de 0.

Para zsh, accede a los rangos de elementos de la matriz con $a[first,last] (donde last también puede ser negativo para 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 vacíos. $a[12,50] se expandiría a los elementos 12 a 50, y ${a[@]:12:2} solo se expandiría a los $a[12] y elementos. Como caso especial, y nuevamente para la portabilidad con ksh93 y bash, zsh también acepta un 0 primer elemento para $@ y lo trata como $0.

Por lo tanto, puede usar ${a[@]:x:n} y ${@:x:n} de forma portátil en los 3 shells, pero solo para matrices no dispersas, y prestar atención a el valor de IFS.

Comentarios

  • Gracias por explicar la sintaxis de indexación de matrices

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *