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

انتخابها, case, select

اادامه یادداشت قبل


راهنمای آموزشی  BashGuide   مؤلف  Lhunath

6. انتخاب‌ها(case و select)

گاهی اوقات می‌خواهید برنامه‌ای منطقی بر مبنای محتوای یک متغیر بسازید. این می‌توانست با گرفتن انشعاب‌های مختلف یک جمله if بر اساس نتایج حاصل از بررسی یک glob پیاده‌سازی شود:

    shopt -s extglob

    if  [[  $LANG = en* ]]; then
        echo \'Hello!\'
    elif [[  $LANG = fr* ]]; then
        echo \'Salut!\'
    elif [[  $LANG = de* ]]; then
        echo \'Guten Tag!\'
    elif [[  $LANG = nl* ]]; then
        echo \'Hallo!\'
    elif [[  $LANG = it* ]]; then
        echo \'Ciao!\'
    elif [[  $LANG = es* ]]; then
        echo \'Hola!\'
    elif [[  $LANG = @(C|POSIX) ]]; then
        echo \'hello world\'
    else
        echo \'I do not speak your language.\'
    fi

اما این همه مقایسه یک مقدار زائد است. BASH یک کلمه‌کلیدی به نام case دقیقاً برای چنین وضعیت‌هایی فراهم نموده است. یک جمله case اساساً چندین احتمال الگوهای جانشین را به شمار می‌آورد و محتوای پارامتر شما را نسبت به آنها بررسی می‌کند:

    case $LANG in
        en*) echo \'Hello!\' ;;
        fr*) echo \'Salut!\' ;;
        de*) echo \'Guten Tag!\' ;;
        nl*) echo \'Hallo!\' ;;
        it*) echo \'Ciao!\' ;;
        es*) echo \'Hola!\' ;;
        C|POSIX) echo \'hello world\' ;;
        *)   echo \'I do not speak your language.\' ;;
    esac

هر انتخاب در جمله case شامل یک الگو( یا لیستی از الگوها با کاراکتر | بین آنها)، یک پرانتز سمت راست، یک بلوک کد که در صورت انطباق رشته با یکی از نمونه‌ها باید اجرا بشود، و دو کاراکتر سمی‌کالن برای علامت‌گذاری انتهای کد( چون ممکن است لازم شود کد را در چند سطر بنویسید). case انطباق نمونه‌ها را موقعی‌که یک مورد موفق است، متوقف می‌کند. سپس می‌توانیم ازالگوی * در انتها برای انطباق با هرحالت دیگری که موارد انتخاب ذکر شده را در بر نمی‌گیرد، به کار ببریم. و در پایان نیز کلمه‌کلیدی esac.

یک ساختار دیگر برای انتخاب، ساختار select می‌باشد. که مشابه یک حلقه است، این جمله‌ای برای سهولت ایجاد منویی از انتخابها می‌باشد، که کاربر می‌تواند از میان آنها گزینش کند .

به کاربر انتخابهایی ارائه می‌شود و از او درخواست می‌شود یک عدد منعکس کننده انتخابش را وارد کند کند. سپس کد داخل بلوک select با متغیری که با انتخاب کاربر تنظیم می‌شود اجرا می‌شود. اگر انتخاب کاربر معتبر نباشد، محتوای متغیر تهی می‌شود:

    $ echo "Which of these does not belong in the group?"; \\
    > select choice in Apples Pears Crisps Lemons Kiwis; do
    > if  [[  $choice = Crisps ]]
    > then echo "Correct!  Crisps are not fruit."; break; fi
    > echo "Errr... no.  Try again."
    > done

تا موقعی که دستور break اجرا نشده است، منو باز تولید می‌شود. در این مثال دستور break فقط وقتی اجرا می‌شود که کاربر مورد صحیح را انتخاب نماید.

همچنین می‌توانیم از متغیر PS3 برای تعیین اعلانی که کاربر به آن پاسخ می‌دهد استفاده کنیم. به جای نشان دادن پرسش قبل از اجرای جمله select، می‌توانیم تنطیم سؤال را به عنوان اعلان انتخاب کنیم:

    $ PS3="Which of these does not belong in the group (#)? " \\
    > select choice in Apples Pears Crisps Lemons Kiwis; do
    > if  [[  $choice = Crisps ]]
    > then echo "Correct!  Crisps are not fruit."; break; fi
    > echo "Errr... no.  Try again."
    > done

تمام این ساختارهای شرطی(if و for و while و case) می‌توانند تو در تو بشوند. این به آن معناست که می‌توانید یک حلقه for با یک حلقه while در داخل آن داشته باشید، یا هر ترکیب دیگر با هرچقدر تودرتویی که مسئله شما را حل کند.

    # یک منوی ساده
    while true; do
        echo "Welcome to the Menu"
        echo "  1. Say hello"
        echo "  2. Say good-bye"

        read -p "-> " response
        case $response in
            1) echo \'Hello there!\' ;;
            2) echo \'See you later!\'; break ;;
            *) echo \'What was that?\' ;;
        esac
    done


تکرارمفید:
جمله select ساختن منوی ساده را آسان می‌کند، اما انعطاف‌پذیری بیشتری ارائه نمی‌کند. اگر چیزی استادانه‌تر خواسته باشید، شایدترجیح بدهید منوی خودتان را با کاربرد یک حلقه while بنویسید، با چند دستور echo یا printf ، و یک دستور read.




  • case(کلمه‌کلیدی): جمله case مقدار یک پارامتر را نسبت به چند الگوی داده شده(انتخاب‌ها) ارزیابی می‌کند.

  • select(کلمه‌کلیدی): جمله select انتخاب چند گزینه را به کاربر پیشنهاد می‌کند و بلوک کد مربوط با انتخاب کاربر در یک پارامتر اجرا می‌کند. منو تا وقتی که یک دستور break اجرا گردد تکرار می‌شود.


پایان فصل پنجم