Veo esto en un script de shell.
variable=${@:2}
¿Qué está haciendo?
var="my_value"; echo var="${var[@]:2}"; echo "$var"
¿Ver la diferencia?
Veo esto en un script de shell.
variable=${@:2}
¿Qué está haciendo?
var="my_value"; echo var="${var[@]:2}"; echo "$var"
¿Ver la diferencia?
Respuestas:
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
.
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
vars=( "${@:2}" )
$@
y ${@}
son idénticos, aunque este último es la sintaxis "más correcta". Debe usar los corchetes con ${@:2}
, porque $@:2
es ambiguo y, por lo tanto, se interpretaría como ${@}:2
, lo que no es lo mismo.
Esa es una ksh
característica que también se encuentra en bash
y versiones recientes de zsh
.
En ksh
y bash
, puede acceder a varios elementos de una matriz mediante el uso de la ${array[@]:first:length}
sintaxis, que se expande hasta length
(o length
se omite) 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 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 está incluido. Entonces ${@:1}
es lo mismo que $@
, no ${@:0}
como para otras matrices.
En zsh
, es un poco diferente. zsh
agregó la ksh
sintaxis solo recientemente por compatibilidad, pero tiene su propia sintaxis para seleccionar rangos de elementos.
Contrariamente a ksh
y bash
, las zsh
matrices son un tipo de variable diferente de las variables escalares, no son dispersas ( zsh
tiene matrices asociativas como otro tipo de variable) y comienzan en el índice 1 en lugar de 0.
Para zsh
acceder a los rangos de elementos de matriz con $a[first,last]
(donde last
tambié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 ksh93
y bash
, zsh
también acepta un 0
primer 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.