Veo esto en un script de shell.
variable=${@:2}
¿Qué está haciendo?
Respuesta1
Muestra 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 guión 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
Respuesta2
Esa es una ksh
característica que también se encuentra en bash
versiones recientes de zsh
.
En ksh
y bash
, puede acceder a varios elementos de una matriz utilizando la ${array[@]:first:length}
sintaxis, que se expande hasta length
(o todos si length
se omite) los elementos de la array
matriz (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 un contexto escalar (como aquí en una asignación a una variable escalar), la lista de elementos se une con caracteres de espacio con bash
y ksh93
y con el primer carácter de $IFS
(o nada si $IFS
está 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 :
, $0
también se incluye. Es ${@:1}
lo mismo que $@
, no ${@:0}
como para otras matrices.
En zsh
, es ligeramente diferente. zsh
Agregó la ksh
sintaxis recientemente por compatibilidad, pero tiene su propia sintaxis para seleccionar rangos de elementos.
A diferencia de ksh
y bash
, zsh
las matrices son un tipo de variable diferente de las variables escalares, no son escasas ( zsh
tienen matrices asociativas como otro tipo de variable) y comienzan 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 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íos) $a[12]
y $a[13]
. Como caso especial, y nuevamente para la portabilidad con ksh93
y bash
, zsh
también acepta un 0
primer elemento $@
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 preste atención al valor de IFS.