Veo esto en una secuencia de comandos de shell.
variable=${@:2}
¿Qué está haciendo?
Comentarios
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
var="my_value"; echo var="${var[@]:2}"; echo "$var"
¿Ves la diferencia?