Ich kann schreiben
VAR=$VAR1
VAR=${VAR1}
VAR="$VAR1"
VAR="${VAR1}"
Das Endergebnis scheint mir alles ungefähr gleich zu sein. Warum sollte ich das eine oder andere schreiben? sind einige davon nicht portabel/POSIX?
Akzeptierte Antwort:
VAR=$VAR1
ist eine vereinfachte Version von VAR=${VAR1}
. Es gibt Dinge, die der zweite tun kann, die der erste nicht kann, zum Beispiel auf einen Array-Index verweisen (nicht portierbar) oder einen Teilstring entfernen (POSIX-portabel). Siehe den Abschnitt Mehr über Variablen im Bash Guide for Beginners and Parameter Expansion in der POSIX-Spezifikation.
Verwendung von Anführungszeichen um eine Variable wie in rm -- "$VAR1"
oder rm -- "${VAR}"
ist eine gute Idee. Dadurch wird der Inhalt der Variablen zu einer atomaren Einheit. Enthält der Variablenwert Leerzeichen (naja, Zeichen in der $IFS
Sondervariable, standardmäßig Leerzeichen) oder Globbing-Zeichen und Sie zitieren es nicht, dann wird jedes Wort für die Dateinamengenerierung (Globbing) berücksichtigt, dessen Erweiterung so viele Argumente für das macht, was Sie tun.
$ 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
Zur Portabilität:
Gemäß POSIX.1-2008 Abschnitt 2.6.2 sind die geschweiften Klammern optional.