گاهی اوقات میخواهید برنامهای منطقی بر مبنای محتوای یک متغیر بسازید. این میتوانست با گرفتن انشعابهای مختلف یک جمله
shopt-s extglobif [[ $ 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 $ 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
هر انتخاب در جمله
یک ساختار دیگر برای انتخاب، ساختار
به کاربر انتخابهایی ارائه میشود و از او درخواست میشود یک عدد منعکس کننده انتخابش را وارد کند کند. سپس کد داخل بلوک
$ 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 = "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
تمام این ساختارهای شرطی(
# یک منوی سادهwhile true; do echo "Welcome to the Menu" echo " 1. Say hello" echo " 2. Say good-bye" read-p "-> " responsecase $ response in 1 ) echo 'Hello there!';; 2 ) echo 'See you later!'; break;; *) echo 'What was that?';; esac done
تکرارمفید:
جمله
در مستندات گنو: Conditional Constructs
در پرسش و پاسخهای رایج:
چگونه میتوانم شناسههای( گزینههای ) خطفرمان را به آسانی مدیریت کنم؟