منبع اصلی نوشتار زیر در این لینک قرار دارد

پرسش و پاسخ شماره ۱۷


پرسش و پاسخ‌های رایج Bash  در Greg\'s Wiki

پرسش و پاسخ شماره ۱۷

چگونه می‌توانم عبارت‌ها را گروه‌بندی کنم، مثل ‎ (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\" در نظر گرفته نمی‌شود. با تعویض کروشه‌ها با پرانتزهای دوتایی‎ ((‎ مثال آنطور کار می‌کند که انتظار می‌رود.


CategoryShell

پرسش و پاسخ 17 (آخرین ویرایش ‎ 2011-07-12 02:24:26 ‎ توسط pool-173-71-205-68)