Vedo questo in uno script di shell.
variable=${@:2}
Cosa sta facendo?
var="my_value"; echo var="${var[@]:2}"; echo "$var"
Vedi la differenza?
Vedo questo in uno script di shell.
variable=${@:2}
Cosa sta facendo?
var="my_value"; echo var="${var[@]:2}"; echo "$var"
Vedi la differenza?
Risposte:
Sta mostrando il contenuto della variabile speciale $@
, in Bash. Esso contiene tutti gli argomenti della linea di comando, e questo comando sta prendendo tutti gli argomenti dal secondo uno e loro memorizzazione in una variabile, variable
.
Ecco una sceneggiatura esemplificativa.
#!/bin/bash
echo ${@:2}
variable=${@:3}
echo $variable
Esempio di esecuzione:
./ex.bash 1 2 3 4 5
2 3 4 5
3 4 5
vars=( "${@:2}" )
$@
e ${@}
sono identici, sebbene quest'ultima sia la sintassi "più corretta". Devi usare le parentesi con ${@:2}
, perché $@:2
è ambiguo e sarebbe quindi interpretato come ${@}:2
, che non è la stessa cosa.
Questa è una ksh
funzionalità presente anche nelle bash
versioni recenti di zsh
.
In ksh
e bash
, è possibile accedere a più elementi di un array usando la ${array[@]:first:length}
sintassi, che si espande fino a length
(o tutti se length
viene omesso) elementi array
dell'array (nell'elenco di elementi dell'array ordinati numericamente sugli indici), iniziando con il primo con indice maggiore o uguale a first
. Quando nel contesto scalare (come qui in un'assegnazione a una variabile scalare) l'elenco di elementi è unito con caratteri spazio con bash
e ksh93
con il primo carattere di $IFS
(o nulla se $IFS
è vuoto o se è impostato) con zsh
.
Per esempio:
$ a[23]=a a[5]=b a[235]=c a[45]=d
$ x=${a[@]:12:2}; printf '<%s>\n' "$x"
<a d>
$@
è un caso speciale. $@
è l'array di parametri posizionali ( $1
, $2
...). Ma se utilizzato con :
, $0
è anche incluso. Quindi ${@:1}
è lo stesso $@
, non ${@:0}
come per gli altri array.
In zsh
, è leggermente diverso. zsh
aggiunta la ksh
sintassi solo di recente per compatibilità, ma ha una sua sintassi per la selezione di intervalli di elementi.
Contrariamente a ksh
e bash
, le zsh
matrici sono di tipo variabile diverso dalle variabili scalari, non sono sparse ( zsh
ha matrici associative come altro tipo di variabile) e iniziano con l'indice 1 anziché 0.
Per zsh
, si accede agli intervalli di elementi dell'array con $a[first,last]
(dove last
può anche essere negativo per contare all'indietro dalla fine).
In zsh
,
a[23]=a a[5]=b a[235]=c a[45]=d
crea un array con 235 elementi, molti dei quali vuoti. $a[12,50]
si espanderebbe agli elementi da 12 a 50 e ${a[@]:12:2}
si espanderebbe solo agli (vuoti) $a[12]
e agli $a[13]
elementi. Come caso speciale, e ancora per portabilità con ksh93
e bash
, zsh
accetta anche un 0
primo elemento $@
e lo considera come $0
.
Pertanto, è possibile utilizzare ${a[@]:x:n}
e ${@:x:n}
trasportare tutte e 3 le shell, ma solo per array non sparsi e prestare attenzione al valore di IFS.