Bu iş parçacığını okuyordum: Nasıl bir dosya satırları üzerinden döngü?
Nedir IFS? Ve- fordöngü bağlamında kullanımı nedir?
Bu iş parçacığını okuyordum: Nasıl bir dosya satırları üzerinden döngü?
Nedir IFS? Ve- fordöngü bağlamında kullanımı nedir?
Yanıtlar:
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.InputInternal 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
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
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:
"$foo"veya değişken bir atamada olduğunda x=$foo, ikameden kaynaklanan dize olduğu gibi kullanılır.$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).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, rldh(burada bir satır karakteridir) ve wdy.
"IFS indirectly determines how ..."?
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.
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.
Ö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 .