IFS
"iç alan ayırıcısı" anlamına gelir. Kabuk tarafından kelime bölmesinin nasıl yapıldığını, yani kelime sınırlarının nasıl tanınacağını belirlemek için kullanılır.
Bunu bash gibi bir kabuğun içinde deneyin (diğer kabukları bunu farklı şekilde idare edebilir, örneğin zsh):
mystring="foo:bar baz rab"
for word in $mystring; do
echo "Word: $word"
done
İçin varsayılan değer IFS
, boşluk karakterlerinden oluşur (kesin olarak: boşluk, sekme ve yeni satır). Her karakter bir kelime sınırı olabilir. Bu nedenle, varsayılan değeri olan IFS
yukarıdaki döngü yazdırılır:
Word: foo:bar
Word: baz
Word: rab
Başka bir deyişle, kabuk boşlukların bir kelime sınırı olduğunu düşünür.
Şimdi, IFS=:
döngüyü çalıştırmadan önce ayarı deneyin . Bu sefer sonuç:
Word: foo
Word: bar baz rab
Şimdi, kabuk mystring
kelimelere ayrılıyor - ama şimdi, yalnızca bir kelimeye sınır kelimesi gibi davranıyor.
İlk karakteri IFS
özeldir: Özel $*
değişkeni kullanırken çıktıdaki kelimeleri sınırlandırmak için kullanılır (örneğin, bunun gibi özel değişkenler hakkında daha fazla bilgi bulabileceğiniz Advanced Bash Scripting Guide'dan alınmıştır ):
$ bash -c 'set w x y z; IFS=":-;"; echo "$*"'
w:x:y:z
Karşılaştırmak:
$ bash -c 'set w x y z; IFS="-:;"; echo "$*"'
w-x-y-z
Her iki örnekte de, kabuk hala karakterlerin tüm tedavi unutmayın :
, -
ve ;
kelime sınırlarını. Değişen tek şey davranışlarıdır $*
.
Bilinmesi gereken başka bir önemli şey de “IFS boşluk alanı” olarak adlandırılan işlemdir . Temel olarak IFS
, boşluk karakterleri içerdiği anda , öncü ve sondaki boşluk boşlukları, işlenmeden önce ayrılacak dizeden çıkarılır ve ardışık boşluk karakterleri dizisi de alanları sınırlar. Ancak, bu yalnızca gerçekten içinde bulunan boşluk karakterleri için geçerlidir IFS
.
Örneğin, dize bakalım "a:b:: c d "
(sondaki boşluk ve iki boşluk karakterleri arasında c
ve d
).
- İle
IFS=:
: Bu dört alan ürüne ayrılır "a"
, "b"
, ""
(boş dize) ve " c d "
(yine iki boşluk arasında c
ve d
). Son alandaki baştaki ve sondaki boşlukları not edin.
- İle
IFS=' :'
, beş alana bölünmelidir olacaktır: "a"
, "b"
, ""
(boş dize), "c"
ve "d"
. Hiçbir yerde lider ve iz bırakan boşluk yok.
Birden çok, ardışık boşluk karakterinin ikinci örnekte iki alanı sınırlandırdığını, ancak çok sayıda ardışık sütunun (boşluk karakterleri olmadığından) değişmediğini unutmayın.
Gelince IFS=$'\n'
, bu ise ksh93
de desteklediği sözdiziminde bash
, zsh
, mksh
ve FreeBSD sh
(bütün kabukları arasında varyasyonlar ile birlikte). Bash manpage'den alıntı:
$ 'String' formundaki kelimeler özel olarak değerlendirilir. Kelime "string" e genişler ve ANSI C standardında belirtildiği şekilde ters eğik çizgi karakterlerini değiştirir.
\n
newline için kaçış dizisidir, bu nedenle IFS
tek bir newline karakterine ayarlanır.