إنشاء قوائم باستخدام الأمر المُضمَّن select في Bash
عام
استخدام أمر select
البُنية اللغوية لأمر select
تشبه بُنية حلقة for
:
select WORD [in LIST]; do RESPECTIVE-COMMANDS; done
ويُستخدم أمر select
من أجل إنشاء قوائم بسهولة عبر اتباع ما يلي:
- تُوسّع القائمة
LIST
مولِّدة قائمة من العناصر ويطبع التوسع في خطأ قياسي (standard error)، كما يُسبق كل عنصر من القائمة برقم. وإن لم تكنin LIST
موجودة فتُطبع المعامِلات الموضعية كما لو تم تحديد@$ in
. أيضًا، تُطبع قائمةLIST
مرة واحدة فقط. - يُطبع محث
PS3
عند طباعة كل العناصر، وكذلك يٌقرأ أول سطر من المُدخلات، وإن احتوى هذا السطر على رقمٍ يطابق رقمَ أحد العناصر فإن قيمةWORD
تتغير إلى اسم ذلك العنصر. وأما إن كان السطر فارغًا فإن العناصر -ومحثPS3
- تعرض جميعًا مرة أخرى. أيضًا، إن قُرأ محرفEOF
فإن الحلقة تخرج.
وبما أن أغلب المستخدمين لا يعرفون أي مجموعة مفاتيح تُستخدم لتسلسل EOF
فإن استخدام أمر break
كواحد من عناصر القائمة يكون أفضل. وعلى خلاف ما سبق فإن أي قيمة أخرى للسطر المقروء ستضبط قيمة متغير WORD
لتكون نصًا فارغًا. ويُحفظ السطر في متغير REPLY
.
تُنفَّذ الأوامر المرتبطة (RESPECTIVE-COMMANDS
) بعد كل اختيار إلى أن يُقرأ الرقم الممثل لأمر break
.
أمثلة
المثال التالي ليس صديقًا للمستخدم (user-friendly) رغم بساطته:
[wiki@hsoub testdir] cat private.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
[wiki@hsoub 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
متداخلة (nested)، أما إن كنت تريد محثًا مختلفًا في القائمة الفرعية فتأكد أن تضبطه في الوقت المناسب.