Bu iş parçacığını okuyordum: Nasıl bir dosya satırları üzerinden döngü?
Nedir IFS
? Ve- for
dö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- for
döngü bağlamında kullanımı nedir?
Yanıtlar:
IFS
anlamı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
\n
for
IFS
BTW, cevapladığınız ikinci çözümden önerilen ikinci çözümdür ...
Gibi @jasonwryan fark, o değil Input
ama Internal
. Adı da var - Input
dan geldi .awk
OFS
Output 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ı . POSIX
S
A::B:
awk
FS
s
zsh
IFS
doğrudan döngü ile ilgili değildir, kelime ayırma ile ilgilidir. IFS
dolaylı 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 $foo
veya 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.$IFS
bir sözcük ayırıcı olarak kabul edilir. Örneğin IFS=":"; foo="12:34::78"; echo $foo
baskılar 12 34 78
( boş bir kelime olduğu için 34
ve 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 IFS
olan boşluk, sekme ve satır eğer öyleyse, foo
iki satır dışarı baskılar hello world
ve howdy
daha sonra döngü gövdesi ile yürütülür x=hello
, sonra x=world
ve x=howdy
. Eğer IFS
açıkça sadece yeni satır içerecek şekilde değiştirilir, ardından döngü için çalıştırılır hello world
ve howdy
. Eğer IFS
olacak ş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 .