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 kshfunzionalità presente anche nelle bashversioni recenti di zsh.
In kshe bash, è possibile accedere a più elementi di un array usando la ${array[@]:first:length}sintassi, che si espande fino a length(o tutti se lengthviene omesso) elementi arraydell'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 bashe ksh93con 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. zshaggiunta la kshsintassi solo di recente per compatibilità, ma ha una sua sintassi per la selezione di intervalli di elementi.
Contrariamente a kshe bash, le zshmatrici sono di tipo variabile diverso dalle variabili scalari, non sono sparse ( zshha 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 lastpuò 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 ksh93e bash, zshaccetta anche un 0primo 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.