Değişken alıntılamanın etkilerini her zaman ile gösterebilirsiniz printf
.
Kelime bölme işlemi yapıldı var1
:
$ var1="hello world"
$ printf '[%s]\n' $var1
[hello]
[world]
var1
alıntı, yani hiçbir kelime bölme:
$ printf '[%s]\n' "$var1"
[hello world]
var1
İçinde sözcük bölme $()
, eşdeğer echo "hello" "world"
:
$ var2=$(echo $var1)
$ printf '[%s]\n' "$var2"
[hello world]
Hiçbir kelime bölme, var1
alıntı yapma ile ilgili bir sorun yok $()
:
$ var2=$(echo "$var1")
$ printf '[%s]\n' "$var2"
[hello world]
Word var1
tekrar bölünüyor :
$ var2="$(echo $var1)"
$ printf '[%s]\n' "$var2"
[hello world]
İkisinden de alıntı yapmak, emin olmanın en kolay yolu.
$ var2="$(echo "$var1")"
$ printf '[%s]\n' "$var2"
[hello world]
Globbing sorunu
Bir değişkeni alıntılamamak aynı zamanda içeriğinin glob genişlemesine yol açabilir:
$ mkdir test; cd test; touch file1 file2
$ var="*"
$ printf '[%s]\n' $var
[file1]
[file2]
$ printf '[%s]\n' "$var"
[*]
Bunun, değişken yalnızca genişletildikten sonra gerçekleştiğini unutmayın. Görevlendirme sırasında bir teklif vermek gerekli değildir:
$ var=*
$ printf '[%s]\n' $var
[file1]
[file2]
$ printf '[%s]\n' "$var"
[*]
set -f
Bu davranışı devre dışı bırakmak için kullanın :
$ set -f
$ var=*
$ printf '[%s]\n' $var
[*]
Ve set +f
yeniden etkinleştirmek için:
$ set +f
$ printf '[%s]\n' $var
[file1]
[file2]