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?