Teknik klasik (escape metacharacters):
if [ \( "$g" -eq 1 -a "$c" = "123" \) -o \( "$g" -eq 2 -a "$c" = "456" \) ]
then echo abc
else echo efg
fi
Saya telah menyertakan referensi $gdalam tanda kutip ganda; itu praktik yang baik, secara umum. Secara ketat, tanda kurung tidak diperlukan karena diutamakan -adan -omembuatnya benar bahkan tanpa mereka.
Perhatikan bahwa operator -adan -omerupakan bagian dari spesifikasi POSIX untuk testalias [, terutama untuk kompatibilitas mundur (karena mereka adalah bagian dari testUNIX Edisi ke-7, misalnya), tetapi mereka secara eksplisit ditandai sebagai 'usang' oleh POSIX. Bash (lihat ekspresi kondisional ) tampaknya mendahului makna klasik dan POSIX untuk -adan -odengan operator alternatifnya sendiri yang mengambil argumen.
Dengan hati-hati, Anda dapat menggunakan [[operator yang lebih modern , tetapi perlu diketahui bahwa versi di Bash dan Korn Shell (misalnya) tidak harus sama.
for g in 1 2 3
do
for c in 123 456 789
do
if [[ ( "$g" -eq 1 && "$c" = "123" ) || ( "$g" -eq 2 && "$c" = "456" ) ]]
then echo "g = $g; c = $c; true"
else echo "g = $g; c = $c; false"
fi
done
done
Contoh jalankan, menggunakan Bash 3.2.57 pada Mac OS X:
g = 1; c = 123; true
g = 1; c = 456; false
g = 1; c = 789; false
g = 2; c = 123; false
g = 2; c = 456; true
g = 2; c = 789; false
g = 3; c = 123; false
g = 3; c = 456; false
g = 3; c = 789; false
Anda tidak perlu mengutip variabel [[seperti yang Anda lakukan [karena itu bukan perintah yang terpisah dengan cara yang [sama.
Bukankah itu pertanyaan klasik?
Saya akan berpikir begitu. Namun, ada alternatif lain, yaitu:
if [ "$g" -eq 1 -a "$c" = "123" ] || [ "$g" -eq 2 -a "$c" = "456" ]
then echo abc
else echo efg
fi
Memang, jika Anda membaca pedoman 'shell portabel' untuk autoconfalat atau paket terkait, notasi ini - menggunakan ' ||' dan ' &&' - adalah apa yang mereka rekomendasikan. Saya kira Anda bahkan bisa pergi sejauh:
if [ "$g" -eq 1 ] && [ "$c" = "123" ]
then echo abc
elif [ "$g" -eq 2 ] && [ "$c" = "456" ]
then echo abc
else echo efg
fi
Jika tindakannya sepele seperti gema, ini tidak buruk. Ketika blok aksi yang akan diulang adalah beberapa baris, pengulangan terlalu menyakitkan dan salah satu versi sebelumnya lebih disukai - atau Anda perlu membungkus aksi menjadi fungsi yang dipanggil dalam thenblok yang berbeda .
test([) dan bukan oleh shell. Shell hanya mengevaluasi status keluar dari[.