Apa yang Anda tulis sebenarnya hampir berhasil (itu akan berhasil jika semua variabel adalah angka), tetapi itu sama sekali bukan cara yang idiomatis.
(…)
tanda kurung menunjukkan sebuah subkulit . Apa yang ada di dalamnya bukan ekspresi seperti dalam banyak bahasa lain. Ini daftar perintah (seperti tanda kurung di luar). Perintah-perintah ini dieksekusi dalam subproses yang terpisah, sehingga setiap pengalihan, penugasan, dll yang dilakukan di dalam tanda kurung tidak memiliki efek di luar tanda kurung.
- Dengan tanda dolar terkemuka,
$(…)
adalah substitusi perintah : ada perintah di dalam tanda kurung, dan output dari perintah digunakan sebagai bagian dari baris perintah (setelah ekspansi tambahan kecuali substitusi berada di antara tanda kutip ganda, tapi itu cerita lain ) .
{ … }
kurung kurawal seperti tanda kurung di mana mereka mengelompokkan perintah, tetapi mereka hanya memengaruhi parsing, bukan pengelompokan. Program ini x=2; { x=4; }; echo $x
mencetak 4, sedangkan x=2; (x=4); echo $x
cetakan 2. (Kawat gigi juga membutuhkan ruang di sekitar mereka dan titik koma sebelum ditutup, sedangkan kurung tidak. Itu hanya sintaks sintaksis.)
- Dengan tanda dolar terkemuka,
${VAR}
adalah ekspansi parameter , yang meluas ke nilai variabel, dengan kemungkinan transformasi tambahan.
((…))
tanda kurung ganda mengelilingi instruksi aritmatika , yaitu, perhitungan pada bilangan bulat, dengan sintaksis yang menyerupai bahasa pemrograman lain. Sintaks ini sebagian besar digunakan untuk penugasan dan dalam kondisi.
- Sintaks yang sama digunakan dalam ekspresi aritmatika
$((…))
, yang diperluas ke nilai integer ekspresi.
[[ … ]]
kurung ganda mengelilingi ekspresi bersyarat . Ekspresi bersyarat sebagian besar dibangun pada operator seperti -n $variable
untuk menguji apakah suatu variabel kosong dan -e $file
untuk menguji apakah ada file. Ada juga operator kesetaraan string: "$string1" == "$string2"
(berhati-hatilah bahwa sisi kanan adalah sebuah pola, mis. [[ $foo == a* ]]
Tes jika $foo
dimulai dengan a
sementara [[ $foo == "a*" ]]
tes jika $foo
tepat a*
) !
, &&
dan ||
operator , dan operator untuk negasi, konjungsi dan disjungsi serta tanda kurung untuk pengelompokan. Perhatikan bahwa Anda memerlukan ruang di sekitar setiap operator (mis [[ "$x" == "$y" ]]
. Tidak [[ "$x"=="$y" ]]
), dan spasi atau karakter seperti ;
di dalam dan di luar tanda kurung (misalnya [[ -n $foo ]]
, tidak[[-n $foo]]
).
[ … ]
kurung tunggal adalah bentuk alternatif dari ekspresi kondisional dengan lebih banyak quirks (tetapi lebih tua dan lebih portabel). Jangan menulis apa pun untuk saat ini; mulai khawatir tentang mereka ketika Anda menemukan skrip yang mengandungnya.
Ini adalah cara idiomatis untuk menulis tes Anda di bash:
if [[ $varA == 1 && ($varB == "t1" || $varC == "t2") ]]; then
Jika Anda membutuhkan portabilitas ke shell lain, ini akan menjadi caranya (perhatikan kutipan tambahan dan kurung terpisah di sekitar setiap tes individu, dan penggunaan =
operator tradisional daripada ==
varian ksh / bash / zsh ):
if [ "$varA" = 1 ] && { [ "$varB" = "t1" ] || [ "$varC" = "t2" ]; }; then