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 -a
ve -o
onlarsız da doğru yapar.
Not, -a
ve -o
operatör için POSIX tarifnamenin bir parçası olan test
diğ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 -a
ve -o
argü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, autoconf
araç 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ı then
bloklarda çağrılan bir işleve sarmanız gerekir .
test
([
) ile değerlendirilir . Kabuk sadece çıkış durumunu değerlendirir[
.