Zawsze możesz pokazać efekty cytowania zmiennych za pomocą printf
.
Podział słów na var1
:
$ var1="hello world"
$ printf '[%s]\n' $var1
[hello]
[world]
var1
cytowany, więc bez podziału słów:
$ printf '[%s]\n' "$var1"
[hello world]
Podział słów w var1
środku $()
, co odpowiada echo "hello" "world"
:
$ var2=$(echo $var1)
$ printf '[%s]\n' "$var2"
[hello world]
Bez podziału słów var1
, nie ma problemu z nie cytowaniem $()
:
$ var2=$(echo "$var1")
$ printf '[%s]\n' "$var2"
[hello world]
var1
Ponowne dzielenie słów :
$ var2="$(echo $var1)"
$ printf '[%s]\n' "$var2"
[hello world]
Cytując oba, najłatwiejszy sposób, aby się upewnić.
$ var2="$(echo "$var1")"
$ printf '[%s]\n' "$var2"
[hello world]
Problem globbingowy
Brak cytowania zmiennej może również prowadzić do globalnego rozszerzenia jej zawartości:
$ mkdir test; cd test; touch file1 file2
$ var="*"
$ printf '[%s]\n' $var
[file1]
[file2]
$ printf '[%s]\n' "$var"
[*]
Zauważ, że dzieje się to po rozwinięciu zmiennej. Podczas przypisywania nie jest konieczne cytowanie globu:
$ var=*
$ printf '[%s]\n' $var
[file1]
[file2]
$ printf '[%s]\n' "$var"
[*]
Użyj, set -f
aby wyłączyć to zachowanie:
$ set -f
$ var=*
$ printf '[%s]\n' $var
[*]
I set +f
ponownie włączyć go:
$ set +f
$ printf '[%s]\n' $var
[file1]
[file2]