Lo vedo in uno script di shell.
variable=${@:2}
Che cosa fa?
Commenti
Risposta
It “s mostra il contenuto della variabile speciale $@, in Bash. Contiene tutti gli argomenti della riga di comando e questo comando prende tutti gli argomenti dal secondo in poi e li memorizza in una variabile , variable.
Esempio
Ecco uno script exampe.
#!/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
Riferimenti
Commenti
- Nota che la tecnica mostrata combina gli argomenti dati in un unico corda. Se devi mantenerli come argomenti separati, usa un array:
vars=( "${@:2}" ) - @glennjackman – grazie per averlo sottolineato.
- Inoltre notare luso delle parentesi graffe. Dovresti sempre usare le parentesi graffe, ma Bash ti consente di ometterle quando il contesto non è ambiguo. Pertanto,
$@e${@}sono identici, sebbene questultimo sia il " più corretto " sintassi. Devi usare le parentesi con${@:2}, perché$@:2è ambiguo e verrebbe quindi interpretato come${@}:2, che non è la stessa cosa.
Answer
That “sa ksh funzionalità presente anche in bash e nelle versioni recenti di zsh.
In ksh e bash, puoi accedere a diversi elementi di un array utilizzando la sintassi ${array[@]:first:length}, che si espande fino a un massimo di length (o tutti se length è omesso) elementi di array array (nella lista degli elementi dellarray ordinati numericamente sugli indici), a partire dal primo con indice maggiore o uguale a first. Quando in contesto scalare (come qui in un assegnazione a una variabile scalare) lelenco degli elementi viene unito con lo spazio ch caratteri con bash e ksh93 e con il primo carattere di $IFS (o niente se $IFS è vuoto o spazio se non è impostato) con zsh.
Ad 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. $@ è larray di parametri posizionali ($1, $2 …). Tuttavia, se utilizzato con :, viene incluso anche $0. Quindi ${@:1} è uguale a $@, non ${@:0} come per altri array.
In zsh, è leggermente diverso. zsh ha aggiunto ksh sintassi solo di recente per compatibilità, ma ha una propria sintassi per la selezione di intervalli di elementi.
Contrariamente a ksh e bash, zsh gli array sono un tipo di variabile diverso dalle variabili scalari, non sono sparsi (zsh ha array associativi come un altro tipo di variabile) e inizia allindice 1 invece di 0.
Per zsh, accedi agli intervalli di elementi dellarray con $a[first,last] (dove last può anche essere negativo per contare allindietro dalla fine).
In zsh,
a[23]=a a[5]=b a[235]=c a[45]=d
crea un array con 235 elementi, la maggior parte dei quali vuoti. $a[12,50] si espande negli elementi da 12 a 50 e ${a[@]:12:2} si espande solo in $a[12] e elementi. Come caso speciale, e ancora per la portabilità con ksh93 e bash, zsh accetta anche un 0 primo elemento per $@ e lo considera come $0.
Quindi, puoi utilizzare ${a[@]:x:n} e ${@:x:n} in modo portabile su tutte e 3 le shell, ma solo per array non sparsi e prestare attenzione a il valore di IFS.
Commenti
- Grazie per aver spiegato la sintassi di indicizzazione degli array
var="my_value"; echo var="${var[@]:2}"; echo "$var"Vedi la differenza?