پرسش و پاسخ شماره ۱۷ - آموزش اسکریپت نویسی
X
تبلیغات
پخش زنده جام جهانی

آموزش اسکریپت نویسی

آموزش اسکریپت نویسی پوسته گنو-لینوکس

#!/bin/bash

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

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

چگونه می‌توانم عبارت‌ها را گروه‌بندی کنم، مثل ‎ (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)