إنشاء قوائم باستخدام الأمر المُضمَّن 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)، أما إن كنت تريد محثًا مختلفًا في القائمة الفرعية فتأكد أن تضبطه في الوقت المناسب.

انظر أيضًا

مصادر