روش قابل حمل(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)