IFS'nin varsayılan değerini anlama


10

GNU bash sürüm 4.2.8'de, IFS varsayılan olarak varsayılan boşluk, sekme ve satır besleme değerine sahiptir:

usr@T42 ~ $ echo -n "$IFS" | hexdump -C
00000000  20 09 0a                                          | ..|
00000003
usr@T42 ~ $ 

Bu tür varsayılan IFS'nin bir nedeni var mı? Buna ek olarak, hangi yardımcı programlar bash yerleşik yanı sıra IFS kullanır read?

Yanıtlar:


13

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 $varkomutta 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 IFSkarakter 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, IFSboş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=$othervarve 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ı IFSgenişletirken anlamlıdır "$*". Gönderen bashadam 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


1
İlk karakteri $IFSde kullanılır, "$*"bu yüzden sipariş önemlidir.
Stéphane Chazelas

2
Ayrıca zsh, varsayılan olarak NUL karakterini de içerdiğine dikkat edin $IFS(diğer mermiler değişkenlerinde NUL karakterini tutmayı desteklemez).
Stéphane Chazelas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.