Quando abbiamo bisogno di parentesi graffe attorno alle variabili di shell?

Negli script di shell, quando usiamo {} quando espandiamo le variabili?

Ad esempio, ho visto quanto segue:

 var=10 # Declare variable echo "${var}" # One use of the variable echo "$var" # Another use of the variable 

C’è una differenza significativa, o è solo uno stile? Si preferisce l’altro?

In questo particolare esempio, non fa differenza. Tuttavia, {} in ${} sono utili se si desidera espandere la variabile foo nella stringa

 "${foo}bar" 

poiché "$foobar" espanderebbe invece il foobar .

Le parentesi graffe sono anche richieste incondizionatamente quando:

  • espandere gli elementi dell’array, come in ${array[42]}
  • utilizzando le operazioni di espansione dei parametri, come in ${filename%.*} (rimuovi estensione)
  • espandendo i parametri posizionali oltre il 9: "$8 $9 ${10} ${11}"

Fare questo ovunque, invece che solo in casi potenzialmente ambigui, può essere considerato una buona pratica di programmazione. Questo è sia per coerenza che per evitare sorprese come $foo_$bar.jpg , dove non è visivamente ovvio che il trattino basso diventi parte del nome della variabile.

Le variabili sono dichiarate e assegnate senza $ e senza {} . Devi usare

 var=10 

assegnare. Per leggere dalla variabile (in altre parole, ‘espandere’ la variabile), devi usare $ .

 $var # use the variable ${var} # same as above ${var}bar # expand var, and append "bar" too $varbar # same as ${varbar}, ie expand a variable called varbar, if it exists. 

Questo mi ha confuso a volte – in altre lingue ci riferiamo alla variabile nello stesso modo, indipendentemente dal fatto che sia a sinistra oa destra di un compito. Ma lo shell-scripting è diverso, $var=10 non fa quello che si potrebbe pensare che faccia!

Usa {} per il raggruppamento. Le parentesi sono necessarie per dereferenziare gli elementi dell’array. Esempio:

 dir=(*) # store the contents of the directory into an array echo "${dir[0]}" # get the first entry. echo "$dir[0]" # incorrect 

Puoi anche manipolare il testo all’interno delle parentesi graffe:

 STRING="./folder/subfolder/file.txt" echo ${STRING} ${STRING%/*/*} 

Risultato:

 ./folder/subfolder/file.txt ./folder 

o

 STRING="This is a string" echo ${STRING// /_} 

Risultato:

 This_is_a_string 

Hai ragione in “variabili regolari” non sono necessari … Ma è più utile per il debug e per leggere uno script.

La fine del nome della variabile è solitamente indicata da uno spazio o una nuova riga. Ma cosa succede se non vogliamo uno spazio o una nuova riga dopo aver stampato il valore della variabile? Le parentesi graffe indicano all’interprete di shell dove si trova la fine del nome della variabile.

Esempio classico 1) – variabile della shell senza spazi vuoti finali

 TIME=10 # WRONG: no such variable called 'TIMEsecs' echo "Time taken = $TIMEsecs" # What we want is $TIME followed by "secs" with no whitespace between the two. echo "Time taken = ${TIME}secs" 

Esempio 2)

 # WRONG CLASSPATH=hibernate-$LATESTVERSION_src.zip:hibernate_$LATEST_VERSION.jar 

(La risposta di Fred lo dice già ma il suo esempio è un po ‘troppo astratto)

Seguendo il suggerimento di SierraX e Peter sulla manipolazione del testo, vengono utilizzate parentesi graffe {} passare una variabile a un comando, ad esempio:

Supponiamo che tu abbia un file sposi.txt contenente la prima riga di un romanzo italiano noto come weel:

 > sposi="somewhere/myfolder/sposi.txt" > cat $sposi 

Ouput: quel ramo del lago di como che volge a mezzogiorno

Ora crea due variabili:

 # Search the 2nd word found in the file that "sposi" variable points to > word=$(cat $sposi | cut -d " " -f 2) # This variable will replace the word > new_word="filone" 

Ora sostituisci il contenuto della parola variabile con quello di new_word , all’interno del file sposi.txt

 > sed -i "s/${word}/${new_word}/g" $sposi > cat $sposi 

Ouput: quel filone del lago di como che volge a mezzogiorno

La parola “ramo” è stata sostituita.