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 $g
dalam tanda kutip ganda; itu praktik yang baik, secara umum. Secara ketat, tanda kurung tidak diperlukan karena diutamakan -a
dan -o
membuatnya benar bahkan tanpa mereka.
Perhatikan bahwa operator -a
dan -o
merupakan bagian dari spesifikasi POSIX untuk test
alias [
, terutama untuk kompatibilitas mundur (karena mereka adalah bagian dari test
UNIX Edisi ke-7, misalnya), tetapi mereka secara eksplisit ditandai sebagai 'usang' oleh POSIX. Bash (lihat ekspresi kondisional ) tampaknya mendahului makna klasik dan POSIX untuk -a
dan -o
dengan 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 autoconf
alat 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 then
blok yang berbeda .
test
([
) dan bukan oleh shell. Shell hanya mengevaluasi status keluar dari[
.