Bourne kabuğunda bir hack olarak başladı. Bourne kabuğunda, liste bağlamında (komut satırı bağımsız değişkenleri veya fordöngülerin döngü yaptığı sözcükler) tüm sözcüklerde IFS sözcük bölünmesi (belirteçlemeden sonra ) yapıldı. Olsaydı:
IFS=i var=file2.txt
edit file.txt $var
İkinci satır 3 deyişle tokenised olacağını, $vargenişletileceğini bildirdi ve çalıştırmakta sona ereceğini böylece bölünmüş + gıdım bile, her üç kelime bitmiş olacaktır edile t, f, le.txt, f, le2.txtargüman olarak.
Bunun bazı bölümlerinden alıntı yapmak, bölünmüş küreyi önleyecektir. Bourne kabuğu başlangıçta hangi karakterlerin alıntılandığını 8'inci dahili olarak ayarlayarak hatırladı (Unix 8 bit temizlendiğinde daha sonra değişti, ancak kabuk hala hangi baytın alıntılandığını hatırlamaya benzer bir şey yaptı).
Her ikisi de $*ve $@konumsal parametrelerin aradaki boşlukla birleşmesiydi. Ancak $@çift tırnak içine alındığında özel bir işlem gerçekleştirildi . Eğer $1içerdiği foo barve $2içerdiği baz, "$@"genişler:
foo bar baz
^^^^^^^ ^^^
( ^yukarıdaki s karakterlerden hangisinin 8. bitin ayarlandığını gösterir). Birinci boşluğun alıntılandığı (8. bitin ayarlandığı) ancak ikincisinin (aradaki sözcükler arasına eklenen) değil.
Ve bağımsız değişkenleri ayırmaya özen gösteren IFS bölünmesi (boşluk karakterinin $IFSvarsayılan olarak olduğu varsayılır). Bu $*, selefi Mashey kabuğunda (Bourson kabuğu sıfırdan yazılırken Thomson kabuğuna dayanarak) nasıl genişletildiğine benzer .
Bu, Bourne kabuğunda, başlangıçta "$@"konumsal parametreler listesi boşken (onunla çalışmak zorunda kaldınız) hiçbir şey yerine boş dizeye neden genişleyeceğini ${1+"$@"}, neden boş konum parametrelerini "$@"saklamadığını ve neden yapmadığını açıklar $IFSboşluk karakteri içermediğinde çalışmaz .
Amaç, bağımsız değişkenler listesini başka bir komuta aynen aktarabilmektir, ancak bu boş liste, boş öğeler veya $IFSboşluk içermediğinde düzgün çalışmadı (ilk iki sorun sonunda sonraki sürümlerde düzeltildi ).
Korn kabuğu (POSIX spesifikasyonunun dayandığı) bu davranışı birkaç şekilde değiştirdi:
- IFS bölme işlemi yalnızca alıntılanmamış genişletmelerin sonucu olarak yapılır ( yukarıdaki örnekte olduğu gibi
editveya file.txtyukarıdaki örnekte değil)
$*ve bir alıntı için , bu birleştiricinin Bourne kabuğundaki gibi tırnaksız olması ve boş olduğunda bir alıntı için , konum parametrelerinin ayırıcı olmadan eklenmesi dışında, boş olduğunda $@ilk karakteri $IFSveya boşluğu ile birleştirilir .$IFS"$@""$*"IFS
- diziler için destek ekledi ve
${array[@]} ${array[*]}Bourne'yi andıran $*ve $@ancak 1 yerine 0 indeksinden başlayarak ve seyrek (daha çok ilişkisel diziler gibi) anlamına geliyor $@, yani gerçekten bir ksh dizisi olarak ele alınamaz ( csh/ rc/ zsh/ fish/ yashnerede $argv/ $*normal ile karşılaştırılamaz) dizileri).
- Boş elemanlar korunur.
"$@"$#0 olduğunda artık boş dize yerine hiçbir şeye genişletilmez, boş olmadığı zaman boşluk içermediğinde "$@"çalışır . Joker karakter içermeyen bir sıralanmamış , boş olduğunda (konumsal parametrelerin boşlukla birleştirildiği) bir argümana genişler .$IFSIFS$*$IFS
ksh93 yukarıdaki kalan birkaç sorunu düzeltti. Ksh93'te $*ve $@konum parametrelerinin listesine genişler, değerinden bağımsız olarak ayrılır $IFSve daha sonra bölünmüş + globbed + brace-genişletilmiş, liste bağlamlarında, $*ilk bayt (karakter değil) ile birlikte $IFS, "$@"liste bağlamlarında listeye genişler değeri ne olursa olsun, konumsal parametrelerin $IFS. Liste dışı bağlamda, in gibi var=$@, $@değerine bakılmaksızın alanı ile birleştirilir $IFS.
bashdizileri ksh olanlardan sonra tasarlanmıştır. Farklılıklar:
- tırnaksız genişleme üzerine destek yok
$IFSbayt yerine ilk karakteri
$*liste dışı bağlamda alıntı yapılmadığında $IFSboş olduğunda genişleme gibi bazı köşe durumu farklılıkları .
POSIX spesifikasyonları oldukça belirsiz olsa da, şimdi aşağı yukarı bash davranışını belirtiyor.
İçindeki kshveya bashiçindeki normal dizilerden farklıdır :
- Endeksler (hariç 1 yerine 0 ° başlangıç
"${@:0}"içeren $0bir konum parametresi (ve işlevlerde fonksiyonun adı ya da kabuk ve nasıl işlev tanımlandı) bağlı olmayan verir).
- Öğeleri ayrı ayrı atayamazsınız
- seyrek değil, öğeleri ayrı ayrı ayarlayamazsınız
shift kullanılabilir.
Olarak zshya da yashdiziler, normal diziler burada (değil seyrek endeksleri diğer kabukları ancak Ksh / deneme gibi bir başlar), $*normal bir dizi olarak işlenir. zshyer alır $argv(uyumluluk için bunun için bir takma csh). veya $*ile aynıdır (ilk karakterine katılan ancak yine de liste bağlamında ayrılmış bağımsız değişkenler ). Korn tarzı özel işlemlere benzer veya bunlardan geçer.$argv${argv[*]}$IFS"$@""${argv[@]}""${*[@]}"}