Sie können die Auswirkungen der variablen Anführungszeichen immer mit anzeigen printf
.
Wortteilung durchgeführt am var1
:
$ var1="hello world"
$ printf '[%s]\n' $var1
[hello]
[world]
var1
zitiert, also keine Wortteilung:
$ printf '[%s]\n' "$var1"
[hello world]
Wortteilung nach var1
innen $()
, entsprechend echo "hello" "world"
:
$ var2=$(echo $var1)
$ printf '[%s]\n' "$var2"
[hello world]
Keine Wortspaltung var1
, kein Problem, wenn man Folgendes nicht zitiert $()
:
$ var2=$(echo "$var1")
$ printf '[%s]\n' "$var2"
[hello world]
Das Wort spaltet sich var1
wieder auf:
$ var2="$(echo $var1)"
$ printf '[%s]\n' "$var2"
[hello world]
Beides zu zitieren, ist der einfachste Weg, sicher zu sein.
$ var2="$(echo "$var1")"
$ printf '[%s]\n' "$var2"
[hello world]
Globbing-Problem
Wenn eine Variable nicht in Anführungszeichen gesetzt wird, kann dies auch zu einer globalen Erweiterung ihres Inhalts führen:
$ mkdir test; cd test; touch file1 file2
$ var="*"
$ printf '[%s]\n' $var
[file1]
[file2]
$ printf '[%s]\n' "$var"
[*]
Beachten Sie, dass dies nur geschieht, nachdem die Variable erweitert wurde. Es ist nicht erforderlich, während der Zuweisung einen Glob anzugeben:
$ var=*
$ printf '[%s]\n' $var
[file1]
[file2]
$ printf '[%s]\n' "$var"
[*]
Verwenden Sie set -f
, um dieses Verhalten zu deaktivieren:
$ set -f
$ var=*
$ printf '[%s]\n' $var
[*]
Und set +f
um es wieder zu aktivieren:
$ set +f
$ printf '[%s]\n' $var
[file1]
[file2]