Che cosa significa questo $ {@: 2} nello scripting di shell

Lo vedo in uno script di shell.

variable=${@:2} 

Che cosa fa?

Commenti

  • È esattamente così che è mostrato nello script? La sintassi sembra un array ma mancano alcuni pezzi. Puoi inserire un paio di righe attorno a questa riga dallo script?
  • Questa è una variabile che inizia dalla seconda lettera. var="my_value"; echo var="${var[@]:2}"; echo "$var" Vedi la differenza?

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

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *