'IFS' nedir?


Yanıtlar:


17

IFSanlamına gelir - alanları ayıran bir karakter. Gönderdiğiniz örnekte, yeni satır karakteri ( ); ayarladıktan sonra metni satır satır işleyecektir. Bu örnekte, değerini (giriş dosyanızda bulunan bir harfe) değiştirebilir ve metnin nasıl bölüneceğini kontrol edebilirsiniz.Input Internal Field Separator\nforIFS

BTW, cevapladığınız ikinci çözümden önerilen ikinci çözümdür ...

Gibi @jasonwryan fark, o değil Inputama Internal. Adı da var - Inputdan geldi .awkOFSOutput Field Separator


1
IFS'nin çıktı parametrelerini birleştirmek için de kullanıldığını unutmayın. Bash man sayfasından: "Genişletme çift tırnak içinde gerçekleştiğinde, her parametrenin değeri IFS özel değişkeninin ilk karakteriyle ayrılmış tek bir kelimeye genişler."
Eric

Aynı zamanda , Bourne kabuğundaki ayırıcıS için olduğu da belirtilmelidir. Korn kabuğunda ve şu anda belirtildiği gibi diğer Bourne benzeri kabukta , Sınırlayıcı içindir (sadece hayal gücünüzü biraz uzatın), örneğin "A", "" ve "B" ye (ekstra yok) ""). Bu 's veya parametre genişletme bayrağından farklı . POSIXSA::B:awkFSszsh
Stéphane Chazelas

27

IFSdoğrudan döngü ile ilgili değildir, kelime ayırma ile ilgilidir. IFSdolaylı olarak komuttan elde edilen çıktının, döngü üzerinde yinelediği parçalara nasıl bölündüğünü belirler.

Korumasız bir değişken değiştirme $fooveya komut değiştirme $(foo)varsa, iki durum vardır:

  • Bağlam tek bir kelime bekliyorsa, örneğin, ikame çift tırnak arasında "$foo"veya değişken bir atamada olduğunda x=$foo, ikameden kaynaklanan dize olduğu gibi kullanılır.
  • Bağlam, çoğu zaman olduğu gibi birden çok kelime bekliyorsa, sonuçta elde edilen dizede iki genişletme daha gerçekleştirilir:
    • Dize kelimelere bölünür . Görünen herhangi bir karakter $IFSbir sözcük ayırıcı olarak kabul edilir. Örneğin IFS=":"; foo="12:34::78"; echo $foobaskılar 12 34 ​ 78( boş bir kelime olduğu için 34ve arasında iki boşluk olacak şekilde 78).
    • Her sözcük bir glob örüntüsü olarak ele alınır ve dosya adları listesine genişletilir . Örneğin foo="*"; echo $foo, geçerli dizindeki dosyaların listesini yazdırır.

Döngüler için, diğer birçok bağlam gibi, bir kelime listesi beklenir. Yani

for x in $(foo); do 

sonları $(foo)kelimelere ve ikramlar Bir gıdım deseni olarak her kelime. Varsayılan değeri IFSolan boşluk, sekme ve satır eğer öyleyse, fooiki satır dışarı baskılar hello worldve howdydaha sonra döngü gövdesi ile yürütülür x=hello, sonra x=worldve x=howdy. Eğer IFSaçıkça sadece yeni satır içerecek şekilde değiştirilir, ardından döngü için çalıştırılır hello worldve howdy. Eğer IFSolacak şekilde değişir o, daha sonra döngü için yürütülür hell, ​ w, rld​␤h(burada ​␤bir satır karakteridir) ve wdy.


Neden "Dolaylı" olarak bahsettiniz "IFS indirectly determines how ..."?
αғsнιη

1
@ αғsнιη IFS(doğrudan) komut ikamesinin çıktısının nasıl parçalandığını belirler, bu da (dolaylı olarak) döngünün neyi devraldığını belirler.
Gilles 'SO- kötü olmayı bırak'

5

itibaren man bash

IFS Genişletme işleminden sonra sözcük bölme ve read builtin komutuyla satırları kelimelere bölme için kullanılan Dahili Alan Ayırıcı. Varsayılan değer şudur: "<boşluk> <tab> <newline>".

Bu Bash'in iç değişkenlerinden biridir. Bash, karakter dizelerini yorumlarken alanları veya sözcük sınırlarını nasıl tanıyacağını belirler.

Varsayılan olarak boşluk (boşluk, sekme ve satırsonu) olmasına rağmen, örneğin virgülle ayrılmış bir veri dosyasını ayrıştırmak için değiştirilebilir.

http://tldp.org/LDP/abs/html/internalvariables.html


0

Önceki harika cevaplara ek olarak, IFS'nin set ile birlikte basit durumlarda verimli ve taşınabilir ayrıştırma için çok yararlı olduğunu eklememe izin verin . Verimli, çünkü grep veya sed gibi alt kabukların ve yumurtlama araçlarının kullanılmasını önler:

resolutions="640x480,320x240"
xIFS=$IFS
IFS=','
for res in $resolutions; do
    xxIFS=$IFS
    IFS='x'
    set -- $res
    width=$1
    height=$2
    # handle width and height
    IFS=$xxIFS
done;
IFS=$xIFS

Komut dosyasının diğer bölümlerinde istenmeyen kırılmaları önlemek için IFS'nin önceki değerini depolamamız ve kurtarmamız gerektiğini unutmayın .

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.