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 var1innen $(), 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 var1wieder 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 +fum es wieder zu aktivieren:
$ set +f
$ printf '[%s]\n' $var
[file1]
[file2]