Klasik teknik (kaçış metakarakterleri):
if [ \( "$g" -eq 1 -a "$c" = "123" \) -o \( "$g" -eq 2 -a "$c" = "456" \) ]
then echo abc
else echo efg
fi
Ben referansları $gçift tırnak içine aldım ; genel olarak bu iyi bir uygulamadır. Kesinlikle, parantezlere gerek yoktur çünkü önceliği -ave -oonlarsız da doğru yapar.
Not, -ave -ooperatör için POSIX tarifnamenin bir parçası olan testdiğer adıyla, [esas olarak (bunlar bir parçası olması nedeniyle için geriye dönük uyumluluk, testörneğin, 7. Baskı UNIX), ancak açıkça POSIX tarafından 'eskimiş' olarak işaretlenir. Bash ( koşullu ifadelere bakın ) , kendi alternatif operatörleri için -ave -oargümanlar alan klasik ve POSIX anlamlarını ön planda tutuyor gibi görünüyor .
Biraz özenle, daha modern bir [[operatör kullanabilirsiniz , ancak Bash ve Korn Shell'deki sürümlerin (örneğin) aynı olması gerekmediğini unutmayın.
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
Mac OS X'te Bash 3.2.57 kullanarak örnek çalıştırma:
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
Değişkenleri [[yaptığınız gibi alıntılamanıza gerek yoktur, [çünkü bu aynı şekilde ayrı bir komut değildir [.
Klasik bir soru değil mi?
Ben de öyle düşünürdüm. Bununla birlikte, başka bir alternatif var, yani:
if [ "$g" -eq 1 -a "$c" = "123" ] || [ "$g" -eq 2 -a "$c" = "456" ]
then echo abc
else echo efg
fi
Gerçekten de, autoconfaraç veya ilgili paketler için 'taşınabilir kabuk' yönergelerini okursanız , bu gösterim - ' ||' ve ' &&' kullanarak - önerdikleri şeydir. Sanırım şu ana kadar gidebilirsin:
if [ "$g" -eq 1 ] && [ "$c" = "123" ]
then echo abc
elif [ "$g" -eq 2 ] && [ "$c" = "456" ]
then echo abc
else echo efg
fi
Eylemlerin yankılanma kadar önemsiz olduğu yerlerde, bu kötü değildir. Tekrarlanacak eylem bloğu birden çok satır olduğunda, tekrar çok acı vericidir ve önceki sürümlerden biri tercih edilir - veya eylemleri farklı thenbloklarda çağrılan bir işleve sarmanız gerekir .
test([) ile değerlendirilir . Kabuk sadece çıkış durumunu değerlendirir[.