IFS değişkeni, kabuk sözcük bölme adı verilen bir görevi her gerçekleştirdiğinde kullanılır . Bunun kullanıldığı en yaygın durumlar, bir $var
komutta parametre genişletme (örn. ) Veya komut değiştirme (örn. $(some-command)
Veya kullanımdan kaldırılmış ters tırnaklar) sonrasındadır. Burada genişletme herhangi bir IFS
karakter içeriyorsa , komut işlenmeden önce farklı 'kelimelere' bölünür. Etkili bir şekilde bu, bu karakterlerin değiştirilen metni farklı argümanlara böldüğü anlamına gelir (değişken ilk önce belirtilirse komutun adı dahil).
Bu nedenle, IFS
boşluk, sekme ve yeni satır olmanın varsayılan değerinin nedeni , bunların normalde bir kelimeyi bölmesi beklenen boşluk karakterleri olmasıdır.
Sözcük ayrımının olmasını önlemenin bir yolu, genişletme ( "$var"
) etrafında çift tırnak kullanmaktır - aslında bunu sorunuzda yapmışsınızdır. Bunu yapmadıysanız echo
, hiçbir argümanı olmayacağı için herhangi bir çıktı olmayacaktır, sadece argümanları bölen karakterler.
Sözcük bölme iki yerde de unutmayın gelmez parametre genişleme sonrasında meydana değişken atama ile (örneğin var=$othervar
ve var=$(somecommand)
ok) ve içindeki [[ ]]
yapının ( [[ $var = $othervar ]]
Tamam, ama [ $var = $othervar ]
alıntı olmalıdır).
Son olarak, bilge bir adamın bana bir kez işaret ettiği gibi, yaygın bir yanlış anlama, bir değişkenin alıntılanmasının tek sebebinin kelime bölünmesinin önlenmesidir . Alıntılama , daha yaygın olarak bilindiği için yol adı genişletmesini veya glob genişlemesini de engeller . Bir değişken gibi glob karakterleri içeriyorsa *
, değişken bir komutta sıralanmamış olarak kullanıldığında bunlar dosya adlarına genişletilebilir. Örneğin:
var=*
echo $var
Bu, geçerli dizindeki dosyaların adlarını görüntüler.
As Stephane aşağıda işaret , içindeki karakterlerin sırası IFS
genişletirken anlamlıdır "$*"
. Gönderen bash
adam sayfası:
"$*" is equivalent to "$1c$2c...", where c is the first character of the value of
the IFS variable. If IFS is unset, the parameters are separated by spaces. If
IFS is null, the parameters are joined without intervening separators.
Sözcük ayırmaya ilişkin daha fazla örnek için lütfen bu yanıta bakın - https://unix.stackexchange.com/a/118444/48083
$IFS
de kullanılır,"$*"
bu yüzden sipariş önemlidir.