Kesin duruma bağlı olarak, bu ya açık bir şekilde belirtilmez (böylece uygulamalar olması gerektiği gibi yapılabilir) veya gözlemlediğiniz gibi gerçekleşmesi gerekir. Tam olarak senaryoda echo ab$
, POSIX sen gözlemlenen "ab $" çıkışını zorunlu kılan ve onu belirtilmemiş değildir . Tüm farklı vakaların kısa bir özeti sonunda.
İki unsur vardır: önce kelimelere tokenleme, sonra bu kelimelerin yorumlanması.
Tokenisation
POSIX tokenizasyonu,$
geçerli bir parametre genişletmesi , komut ikamesi veya aritmetik ikamenin başlangıcı olmayan bir kodun, oluşturulmakta olan simgenin gerçek bir parçası olarak kabul edilmesini gerektirir WORD
. Bunun nedeni, kural 5'in ("Geçerli karakter sıralanmamışsa $
veya `
kabuğun, başlangıçtaki sıralanmamış karakter dizilerinden parametre genişletme, komut ikamesi veya aritmetik genişletme için adayların başlangıcını tanımlaması gerekir: $
veya ${
, $(
veya `
, ve $((
," ) geçerli değildir, çünkü bu genişletmelerin hiçbiri geçerli değildir. Parametre genişletmesi, orada görünmesi için geçerli bir ad gerektirir ve boş bir ad geçerli değildir.
Bu kural geçerli olmadığından, geçerli olanı bulana kadar takip etmeye devam ediyoruz. İki aday # 8'dir ("Önceki karakter bir kelimenin parçasıysa, geçerli karakter bu sözcüğe eklenmelidir.") Ve # 10 ("Geçerli karakter yeni bir sözcüğün başlangıcı olarak kullanılır.") , echo a$
ve echo $
sırasıyla uygulanır .
echo a$+b
Aynı çatlaktan geçen formun üçüncü bir vakası da vardır , çünkü +
özel bir parametrenin adı değildir. Bu, daha sonra geri döneceğiz, çünkü kuralların farklı bölümlerini tetikliyor.
Dolayısıyla, spesifikasyon $
sözdiziminin sözdiziminin bir parçası olarak düşünülmesini gerektirir ve daha sonra daha sonra işlenebilir.
Kelime genişletme
Giriş, bu şekilde ayrıştırıldıktan sonra $
, sözcüğe dahil edildiğinde, okunan kelimelerin her birine sözcük genişletmeleri uygulanır. Her kelime ayrı ayrı işlenir .
Belirtildi :
Alıntılanmamış bir '$' ifadesinin ardından aşağıdakilerden biri olmayan bir karakter gelirse:
- Sayısal bir karakter
- Özel parametrelerden birinin adı (bkz. Özel Parametreler )
- Değişken adının geçerli bir ilk karakteri
- A
<left-curly-bracket>
('{')
- bir
<left-parenthesis>
sonuç belirtilmemiş.
"Belirtilmemiş" burada özel bir terimdir.
- Uygun bir kabuk bu durumda herhangi bir davranış seçebilir
- Uygun bir uygulama belirli bir davranışa güvenemez
Örnekte, echo ab$
, $
takip etmiyorsa herhangi karakteri bu kural geçerli değildir bu yüzden ve tanımlanmamış sonuç çağrılmaz. Basitçe tahrik edilen bir genişleme yoktur $
, bu yüzden tam anlamıyla mevcut ve basılır.
Nerede olacağını uygulamak yukarıdan üçüncü durumda geçerli: echo a$+b
. İşte $
izlemektedir +
(Sayı, özel parametre olmadığı, @
, *
,#
, ?
, -
, $
, !
, ya da 0
), değişken bir başlangıç adı (alt çizgi veya bir alfabetik taşınabilir karakter kümesi ) ya da parantez biri. Bu durumda, davranış belirtilmez: uygun bir kabuğun genişleme adı verilen özel bir parametre icat etmesine izin verilir+
ve uygun bir uygulama kabuğun bunu yapmadığını varsaymamalıdır . Kabuk, bir hata bildirimi de dahil olmak üzere sevdiği başka her şeyi yapabilir.
Örneğin, zsh, kendi POSIX modunda da dahil olmak üzere , yorumlanması $+b
"değişkendir olarak b
grubu" ya da ve yerine yerine 1 ya da 0. Benzer şekilde ~
ve için uzantılar vardır =
. Bu uygun davranıştır.
Bunun olabileceği başka bir yer echo "a$ b"
. Yine, kabuğun istediği gibi yapmasına izin verilir ve senaryo yazarı olarak $
sizden gerçek çıktı istiyorsanız. Bunu yapmazsanız işe yarayabilir, ancak ona güvenemezsiniz. Bu şartnamenin mutlak mektubu, ancak bu tür ayrıntıların amaçlandığını veya dikkate alındığını düşünmüyorum.
Özetle
echo ab$
: tam çıktı, tam olarak belirtilmiş
echo a$ b
: tam çıktı, tam olarak belirtilmiş
echo a$ b$
: tam çıktı, tam olarak belirtilmiş
echo a$b
: parametrenin genişletilmesi b
, tam olarak belirtilmiş
echo a$-b
: özel parametrenin genişletilmesi -
, tam olarak belirtilmiş
echo a$+b
: belirtilmemiş davranış
echo "a$ b"
: belirtilmemiş davranış
Bir İçin $
Bir kelimenin sonunda, sen davranışa güvenmek izin verilir ve tam anlamıyla tedavi ve aktarılması gereken echo
, bağımsız değişkeni bir parçası olarak komuta. Bu kabuk üzerinde bir uyumluluk gereksinimidir.
$
kazanıyor mu ?" Tek bir özel anlamı yoktur$
; parametre genişletme${...}
, komut ikamesi$(...)
ve aritmetik ifadeler gibi birden çok, ancak farklı genişletme yapmak için kullanılır$((...))
. Bazı mermiler,ksh
komutun yerine koyma varyantı gibi ek bağlamlarx=${ echo foo; echo bar;}
getirir (bu$(...)
, bir alt kabukta komutları yerine getirmeyerek standarttan farklıdır ).