Dizelerin içine enterpole edilebilecek iç içe geçmiş yapıların içinde başka dizeler de olabilir: yeni bir komut dosyası gibi, kapanış işaretçisine kadar ayrıştırılırlar ve hatta birden çok düzey derinliğinde iç içe bile yerleştirilebilirler. Tüm çubuklardan biri a ile başlar $
. Hepsi Bash manuel ve POSIX kabuk komut dili spesifikasyonunun bir kombinasyonu halinde belgelenmiştir.
Bu yapıların birkaç örneği vardır:
Bulduğunuz gibi ile ikame komutunu verin$( ... )
. POSIX bu davranışı belirtir :
İle $(command)
forma, eşleştirme kapanış parantez açık parantez aşağıdaki tüm karakterler komutunu oluşturmaktadır. Herhangi geçerli kabuk komut dosyası için kullanılabilir komutu ...
Alıntılar geçerli kabuk komut dosyalarının bir parçasıdır, bu yüzden normal anlamlarına izin verilir.
- Kullanarak
`
da ikame komutunu verin .
Gibi gelişmiş parametre ikame örnekleri${parameter:-word}
"kelime" elemanı . "Sözcüğü" tanımı ise :
Kabuk tarafından birim olarak işlem gören bir karakter dizisi
- alıntılanan metin ve hatta karışık alıntılar içeren a"b"c'd'e
- genişletmelerin gerçek davranışı bundan biraz daha liberal olsa da, örneğin de ${x:-hello world}
işe yarıyor.
Aritmetik genişleme ile $(( ... ))
, büyük ölçüde yararsız olmasına rağmen orada (ama yuva komut ikamesi veya değişken açılımları da ve daha sonra bu iç yararlı bir tırnak olabilir). POSIX şunları söylüyor :
İfade, ifadenin içindeki bir çift tırnak özel olarak ele alınmaması dışında, çift tırnak içine alınmış gibi ele alınacaktır. Kabuk, parametre genişletme, komut değiştirme ve tırnak kaldırma için ifadedeki tüm simgeleri genişletmelidir.
bu nedenle bu davranış açıkça gereklidir. Bu echo "abc $((4 "*" 5))"
, globbing yerine aritmetik demektir .
Eski stil $[ ... ]
aritmetik genişletmenin aynı şekilde ele alınmadığına dikkat edin: tırnak işaretleri, genişlemenin alıntılanıp alıntılanmamasına bakılmaksızın, görünürse bir hata olacaktır. Bu form artık belgelenmemiştir ve yine de kullanılması amaçlanmamıştır.
- İle
$"..."
"
temel öğe olarak kullanılan yerel ayara özgü çeviri . $"
tek bir birim olarak ele alınır.
Ayracı genişletme özelliğine sahip, tırnak içermeyen, beklemeyebileceğiniz başka bir yuvalama durumu daha vardır : {a,b{c,d},e}
"a bc bd e" ye genişler. ${x:-a{b,c}d}
does not Ancak yuva; " a{b,c
" ve ardından " " veren bir parametre ikamesi olarak kabul edilir d}
. Bu da belgelenmiştir :
Diş telleri kullanıldığında, eşleşen bitiş ayracı, ters eğik çizgi veya tırnak içine alınmış bir dize içinde kaçan ve gömülü bir aritmetik genişletme, komut değiştirme veya parametre genişletme içinde olmayan ilk '}' olur.
Genel bir kural olarak, tüm sınırlandırılmış yapılar bedenlerini çevredeki bağlamdan bağımsız olarak ayrıştırır (ve istisnalar hata olarak değerlendirilir ). Özünde, $(
komut değiştirme kodunu görünce ayrıştırıcıdan yeni bir programmış gibi gövdeden neler yapabileceğini sorar ve sonra alt ayrıştırıcı çalıştığında beklenen sonlandırma işaretinin (çıkışsız )
veya ))
veya }
) göründüğünü kontrol eder. tüketebilecekleri şeylerden.
Özyinelemeli bir ayrıştırıcının işleyişini düşünüyorsanız , bu temel duruma basit bir özyineleme. Aslında, dize enterpolasyonunuz olduğunda, diğer yoldan yapmak daha kolaydır. Altta yatan ayrıştırma tekniğinden bağımsız olarak, bu yapıları destekleyen kabuklar aynı sonucu verir.
Bu yapılar üzerinden alıntıyı istediğiniz kadar derine yerleştirebilirsiniz ve beklendiği gibi çalışacaktır. Ortada bir alıntı görerek hiçbir yerde kafanız karışmayacak; bunun yerine, bu, iç bağlamda yeni bir alıntılanan dizenin başlangıcı olacaktır.