Yazdıklarınız neredeyse işe yarıyor (tüm değişkenler sayı olsaydı işe yarardı), ama bu deyimsel bir yol değil.
(…)
parantezler bir alt kabuğu gösterir . İçlerindeki şey, diğer birçok dilde olduğu gibi bir ifade değildir. Komutların bir listesi (tıpkı dış parantezler gibi). Bu komutlar ayrı bir alt işlemde yürütülür, bu nedenle parantez içinde yapılan yeniden yönlendirme, atama vb. Parantezlerin dışında bir etkiye sahip değildir.
- Başında dolar işareti
$(…)
olan bir komut ikamesi vardır : parantez içinde bir komut vardır ve komuttan çıktı komut satırının bir parçası olarak kullanılır (ikame çift tırnak işaretleri arasında olmadığı sürece ekstra genişletmelerden sonra, ancak bu başka bir hikaye ) .
{ … }
parantezler komutları grupladıkları için parantez gibidir, ancak gruplamayı değil ayrıştırmayı etkilerler. Program x=2; { x=4; }; echo $x
4 yazdırır, oysa 2 x=2; (x=4); echo $x
yazdırır.
- Önde gelen dolar işareti ile, olası ekstra dönüşümlerle birlikte bir değişkenin değerine genişleyen
${VAR}
bir parametre genişletmesidir .
((…))
çift parantez , diğer programlama dillerine benzeyen bir sözdizimiyle aritmetik bir komutu , yani tamsayıları hesaplar. Bu sözdizimi çoğunlukla ödevler ve şartlar için kullanılır.
- Aynı sözdizimi, ifadenin
$((…))
tamsayı değerine genişleyen aritmetik ifadelerde kullanılır .
[[ … ]]
çift parantez, koşullu ifadeleri çevreler . Koşullu ifadeler çoğunlukla bir değişkenin boş olup olmadığını sınama ve bir dosyanın var olup olmadığını sınama gibi işleçler üzerine kurulur. : String eşitlik operatörleri de vardır (sağ taraftaki bir desen, örneğin olduğunu dikkat testleri eğer ile başlar iken testler ise tam olarak ), ve tanıdık , ve olumsuzluk, birlikte ve ayrılmalara yanı sıra gruplama için parantez için operatörler. Not Her operatör (örneğin etrafında bir alanına ihtiyaç duyduğunu değil ) ve bir boşluk ya da benzeri bir karakter hem iç hem dış parantez (örneğin , değil-n $variable
-e $file
"$string1" == "$string2"
[[ $foo == a* ]]
$foo
a
[[ $foo == "a*" ]]
$foo
a*
!
&&
||
[[ "$x" == "$y" ]]
[[ "$x"=="$y" ]]
;
[[ -n $foo ]]
[[-n $foo]]
).
[ … ]
tek parantez daha fazla tuhaf (ama daha eski ve daha taşınabilir) ile koşullu ifadelerin alternatif bir şeklidir. Şimdilik bir şey yazma; bunları içeren komut dosyaları bulduğunuzda endişelenmeye başlayın.
Testinizi bash'da yazmanın deyimsel yolu:
if [[ $varA == 1 && ($varB == "t1" || $varC == "t2") ]]; then
Diğer kabuklara taşınabilirliğe ihtiyacınız varsa, bu yol olacaktır (her bir testin etrafındaki ek alıntıları ve ayrı parantez setlerini =
ve ksh / bash / zsh ==
varyantı yerine geleneksel operatörün kullanımını not edin ):
if [ "$varA" = 1 ] && { [ "$varB" = "t1" ] || [ "$varC" = "t2" ]; }; then