ساختار selectتولید آسان منو را میسر میکند. دستور زبان کاملاً مشابه همان است که برای حلقه for است:
select
WORD
[in LIST
]; do RESPECTIVE-COMMANDS; done
LIST
به تولید لیستی از اقلام، بسط مییابد. بسط در خروجی استاندارد خطا چاپ میشود، جلوی هر یک از اقلام یک عدد قرار میگیرد. اگر in LIST
حاضر نباشد، پارامترهای موضعی چاپ میشوند، همانطورکه اگر in $@
تعیین شده بود. LIST
فقط یک مرتبه چاپ میشود.
بعد از چاپ تمام اقلام، اعلان PS3
چاپ میشود و یک سطر از ورودی خوانده میشود. اگر این سطر یک عدد مطابق عدد مقابل یکی از اقلام باشد، مقدار WORD
مطابق نام آن مورد از اقلام تنظیم میگردد. اگر سطر تهی باشد، اقلام و اعلان PS3
دوباره نمایش داده میشوند. اگر یک EOF ( کاراکتر انتهای فایل ) خوانده شود، حلقه خارج میشود. نظر به اینکه اکثر کاربران نشانی ازآنکه کدام ترکیب کلیدی برای ایجاد EOF به کارمیرود، ندارند، داشتن یک فرمان break به عنوان یکی از اقلام، بیشتر کاربر پسند است. سطر خوانده شده با هر مقدار دیگر، WORD
را مطابق یک رشته تهی تنظبم میکند.
سطر خوانده شده در متغیر REPLY
ذخیره میشود.
دستورات RESPECTIVE-COMMANDS بعد از هر انتخاب اجرا میگردند، تا اینکه عدد خوانده شده نماینده break باشد. در این حالت حلقه خارج میشود.
این یک مثال بسیار ساده است، اما به طوری که میبینید، خیلی کاربر پسند نیست:
[carol@octarine testdir]
catprivate.sh
#!/bin/bash echo "This script can make any of the files in this directory private." echo "Enter the number of the file you want to protect:" select FILENAME in *; do echo "You picked $FILENAME ($REPLY), it is now only accessible to you." chmod go-rwx "$FILENAME" done[carol@octarine testdir]
./private.sh This script can make any of the files in this directory private. Enter the number of the file you want to protect: 1) archive-20030129 2) bash 3) private.sh #? 1 You picked archive-20030129 (1) #?
تنظیم اعلان PS3
و اضافه کردن امکان خروج آن را بهتر میکند:
#!/bin/bash echo "This script can make any of the files in this directory private." echo "Enter the number of the file you want to protect:" PS3="Your choice: " QUIT="QUIT THIS PROGRAM - I feel safe now." touch "$QUIT" select FILENAME in *; do case $FILENAME in "$QUIT") echo "Exiting." break ;; *) echo "You picked $FILENAME ($REPLY)" chmod go-rwx "$FILENAME" ;; esac done rm "$QUIT"
هر جملهای در داخل یک ساختار select میتواند یک حلقه دیگر select باشد، منو یا منوهای فرعی در داخل یک منو را فعال میکند.
به طور پیشفرض متغیر PS3
موقعی که وارد یک حلقه select تو در تو میشوید، تغییر نمیکند. اگر یک اعلان متفاوت برای منوهای فرعی میخواهید، از تنظیم نمودن آن در موقع مناسب مطمئن شوید.