posso scrivere
VAR=$VAR1
VAR=${VAR1}
VAR="$VAR1"
VAR="${VAR1}"
il risultato finale a me sembra tutto più o meno lo stesso. Perché dovrei scrivere l'uno o l'altro? qualcuno di questi non è portatile/POSIX?
Risposta accettata:
VAR=$VAR1
è una versione semplificata di VAR=${VAR1}
. Ci sono cose che il secondo può fare che il primo non può, ad esempio fare riferimento a un indice di array (non portatile) o rimuovere una sottostringa (POSIX-portatile). Vedi la sezione Altro sulle variabili della Bash Guide for Beginners and Parameter Expansion nelle specifiche POSIX.
Usare le virgolette attorno a una variabile come in rm -- "$VAR1"
o rm -- "${VAR}"
è una buona idea. Questo rende il contenuto della variabile un'unità atomica. Se il valore della variabile contiene spazi vuoti (beh, i caratteri nel $IFS
variabile speciale, spazi vuoti per impostazione predefinita) o caratteri glob e non la citi, quindi ogni parola viene considerata per la generazione del nome file (globbing) la cui espansione fornisce tanti argomenti a qualsiasi cosa tu stia facendo.
$ find .
.
./*r*
./-rf
./another
./filename
./spaced filename
./another spaced filename
./another spaced filename/x
$ var='spaced filename'
# usually, 'spaced filename' would come from the output of some command and you weren't expecting it
$ rm $var
rm: cannot remove 'spaced': No such file or directory
# oops! I just ran 'rm spaced filename'
$ var='*r*'
$ rm $var
# expands to: 'rm' '-rf' '*r*' 'another spaced filename'
$ find .
.
./another
./spaced filename
./another spaced filename
$ var='another spaced filename'
$ rm -- "$var"
$ find .
.
./another
./spaced filename
Sulla portabilità:
Secondo POSIX.1-2008 sezione 2.6.2, le parentesi graffe sono facoltative.