GNU/Linux >> LINUX-Kenntnisse >  >> Linux

$var Vs ${var} Und zitieren oder nicht zitieren?

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.


Linux
  1. Linux – Warum verwenden wir Su – und nicht nur Su?

  2. „nohup Sudo …“ fragt nicht nach Passwd und tut nichts?

  3. Ist das Paket, das ich gerade installiert habe, legitim, und wenn nicht, wie kann ich es deinstallieren?

  4. Warum ist es Rm -rf und nicht Rmdir -rf?

  5. So führen Sie den Befehl „find“ nur im aktuellen Verzeichnis und nicht in Unterverzeichnissen aus

So finden Sie heraus, ob ein Paket unter Linux und Unix installiert ist oder nicht

Ubuntu 17.10 Bildschirmsperre funktioniert nicht und ist grau?

Unterschied zwischen einfachen und doppelten Anführungszeichen in Bash Shell

Firefox hat den Download-Workflow geändert, und ich bin kein Fan

readlink -f und -e Optionsbeschreibung nicht klar

Warum funktioniert mein Crontab nicht und wie kann ich es beheben?