Anda selalu dapat menunjukkan efek dari kutip variabel printf
.
Pemisahan kata dilakukan pada var1
:
$ var1="hello world"
$ printf '[%s]\n' $var1
[hello]
[world]
var1
dikutip, jadi tidak ada pemisahan kata:
$ printf '[%s]\n' "$var1"
[hello world]
Pemisahan kata di var1
dalam $()
, setara dengan echo "hello" "world"
:
$ var2=$(echo $var1)
$ printf '[%s]\n' "$var2"
[hello world]
Tidak ada pemisahan kata var1
, tidak ada masalah dengan tidak mengutip $()
:
$ var2=$(echo "$var1")
$ printf '[%s]\n' "$var2"
[hello world]
Pemisahan kata var1
lagi:
$ var2="$(echo $var1)"
$ printf '[%s]\n' "$var2"
[hello world]
Mengutip keduanya, cara termudah untuk memastikan.
$ var2="$(echo "$var1")"
$ printf '[%s]\n' "$var2"
[hello world]
Masalah global
Tidak mengutip suatu variabel juga dapat menyebabkan pengembangan konten global:
$ mkdir test; cd test; touch file1 file2
$ var="*"
$ printf '[%s]\n' $var
[file1]
[file2]
$ printf '[%s]\n' "$var"
[*]
Perhatikan ini terjadi setelah variabel diperluas saja. Tidak perlu mengutip glob selama penugasan:
$ var=*
$ printf '[%s]\n' $var
[file1]
[file2]
$ printf '[%s]\n' "$var"
[*]
Gunakan set -f
untuk menonaktifkan perilaku ini:
$ set -f
$ var=*
$ printf '[%s]\n' $var
[*]
Dan set +f
untuk mengaktifkannya kembali:
$ set +f
$ printf '[%s]\n' $var
[file1]
[file2]