Nasıl bir kabuk içinde birden fazla koşul temsil edecek?
Bunun gibi birden fazla koşul temsil etmek istiyorum:
if [ ( $g -eq 1 -a "$c" = "123" ) -o ( $g -eq 2 -a "$c" = "456" ) ]
then
echo abc;
else
echo efg;
fi
ama senaryoyu yürütme zaman gösterir
syntax error at line 15: `[' unexpected,
satır 15 eğer bir gösteren olduğu ....
Bu durum yanlış olan nedir? Bir şey ()
yanlış sanırım.
CEVAP
(Kaçış meta) klasik yöntem
if [ \( "$g" -eq 1 -a "$c" = "123" \) -o \( "$g" -eq 2 -a "$c" = "456" \) ]
then echo abc
else echo efg
fi
Çift tırnak içinde $g
başvuruları ekledim; bu, genel olarak iyi bir alıştırma olur. Kesinlikle, parantez -a
-o
önceliği bu doğru bile ihtiyaç duymadan yapar, çünkü ihtiyacı yok.
Not -a
-o
operatörler bölümü POSIX belirtimi için test
aka [
, özellikle geriye doğru uyumluluk (kızlar bölümü test
7. Edition, UNIX, örneğin), ama onlar açıkça işaretlenmiş olarak 'obsolescent' tarafından POSIX. Bash (conditional expressions) bağımsız değişkenler, kendi alternatif operatörleri ile -a
-o
klasik ve POSIX anlamları safdışı bırakacak gibi görünüyor.
Biraz dikkat ile, daha modern [[
operatörünü kullanabilirsiniz, ama Bash ve Korn Kabuğu sürümleri (örneğin) aynı olması gerekmez 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
Örneğin, Mac OS X Bash 3.2.57 kullanarak çalıştırın:
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
[
aynı şekilde ayrı bir komut değildir çünkü [
gibi [[
değişkenler alıntı gerek yok.
Bu klasik bir soru değil mi?
Ben de öyle düşünmüştüm. Ancak, başka bir alternatif, yani vardır:
if [ "$g" -eq 1 -a "$c" = "123" ] || [ "$g" -eq 2 -a "$c" = "456" ]
then echo abc
else echo efg
fi
Gerçekten de, eğer okuduğunuz 'taşınabilir shell' kurallar için autoconf
aracı ya da ilgili paketleri, bu gösterimde — 'kullanarak||
' ve '&&
' — ne tavsiye ediyorlar. Şimdiye kadar bile girebilirsin sanırım:
if [ "$g" -eq 1 ] && [ "$c" = "123" ]
then echo abc
elif [ "$g" -eq 2 ] && [ "$c" = "456" ]
then echo abc
else echo efg
fi
Eylemler yankı kadar önemsiz, bu kadar da kötü değil. Eylemi engellemek için tekrarlanır birden fazla satır, tekrarda çok acı ve bir önceki sürümleri tercih edilir — ya da ihtiyacınız sarma eylemler içine bir işlevi çağrılır farklı then
blokları.
Nasıl böyle büyük mükafat içinde birde...
Bir film şeridi içinde, nasıl birden f...
Nasıl bir düzenli ifade içinde birden ...
Nasıl İfade içinde birden fazla dosya ...
Nasıl Vim içinde birden fazla satır sa...