چگونه میتوانم عبارتها را گروهبندی کنم، مثل (a AND b) OR c؟
روش قابل حمل(POSIX یا Bourne) استفاده از چندین فرمان test (یا [) است:
# Bourne if test A && test B || test C; then ...
در این حالت گروهبندی به صورت ضمنی است، زیرا AND یعنی(&&) تقدم بالاتری نسبت به OR یعنی(||) دارد. اگر به گروهبندی آشکار نیاز داشته باشیم، آنوقت میتوانیم از ابروها استفاده نماییم:
# Bourne(?) if test A && { test B || test C; }; then ...
آنچه که نباید انجام بدهیم، آزمایش استفاده از عملگرهای -a یا -o فرمان test میباشد، زیرا نتیجه آن، تعریف نشده، است.
BASH و KornShell دارای فرمانهای مقایسه قدرتمندتر مختلفی با تفاوت جزئی(آسانتر) در نقلقول کردن، میباشند:
-
بسط محاسباتی برای عبارتهای حسابی، و
فرمان تست جدید برای بسط رشته(و فایل) .
مثالها:
# Bash/ksh if (( (n>0 && n<10) || n == -1 )) then echo \"0 < $n < 10, or n==-1\" fi
یا
# Bash/ksh if [[ ( -f $localconfig && -f $globalconfig ) || -n $noconfig ]] then echo \"configuration ok (or not used)\" fi
توجه نمایید که تمایز میان مقایسه رشتهای و عددی، سختگیرانه است. مثال پایین را ملاحظه کنید:
n=3 if [[ $n>0 && $n<10 ]] then echo \"$n is between 0 and 10\" else echo \"ERROR: invalid number: $n\" fi
خروجی \"ERROR: ....\" خواهد بود، به دلیل آنکه در یک مقایسه رشتهای \"3\" بزرگتر از \"10\" است، چون \"3\" بعد از \"1\" میآید، و کاراکتر بعدی \"0\" در نظر گرفته نمیشود. با تعویض کروشهها با پرانتزهای دوتایی (( مثال آنطور کار میکند که انتظار میرود.
پرسش و پاسخ 17 (آخرین ویرایش 2011-07-12 02:24:26 توسط pool-173-71-205-68)