الفرق بين المراجعتين لصفحة: «Bash/making menus with the select built-in»

من موسوعة حسوب
إدخال 2.0 محتوى أولي
إدخال 3.0 تنسيق الصفحة
سطر 4: سطر 4:


=== استخدام أمر select ===
=== استخدام أمر select ===
البُنية اللغوية لأمر select تشبه بُنية حلقة for:<syntaxhighlight lang="bash">
البُنية اللغوية لأمر <code>select</code> تشبه بُنية حلقة <code>for</code>:<syntaxhighlight lang="bash">
select WORD [in LIST]; do RESPECTIVE-COMMANDS; done
select WORD [in LIST]; do RESPECTIVE-COMMANDS; done
</syntaxhighlight>ويُستخدم أمر select من أجل إنشاء قوائم بسهولة عبر اتباع ما يلي:
</syntaxhighlight>ويُستخدم أمر <code>select</code> من أجل إنشاء قوائم بسهولة عبر اتباع ما يلي:
* تُوسّع القائمة LIST مولِّدة قائمة من العناصر ويطبع التوسع في خطأ قياسي (standard error)، كما يُسبق كل عنصر من القائمة برقم. وإن لم تكن in LIST موجودة فتُطبع المعامِلات الموضعية كما لو تم تحديد @$ in. أيضًا، تُطبع قائمة LIST مرة واحدة فقط.
* تُوسّع القائمة <code>LIST</code> مولِّدة قائمة من العناصر ويطبع التوسع في خطأ قياسي (standard error)، كما يُسبق كل عنصر من القائمة برقم. وإن لم تكن <code>in LIST</code> موجودة فتُطبع المعامِلات الموضعية كما لو تم تحديد <code>@$ in</code>. أيضًا، تُطبع قائمة <code>LIST</code> مرة واحدة فقط.
* يُطبع محث PS3 عند طباعة كل العناصر، وكذلك يٌقرأ أول سطر من المُدخلات، وإن احتوى هذا السطر على رقمٍ يطابق رقمَ أحد العناصر فإن قيمة WORD تتغير إلى اسم ذلك العنصر. وأما إن كان السطر فارغًا فإن العناصر -ومحث PS3- تعرض جميعًا مرة أخرى. أيضًا، إن قُرأ محرف EOF فإن الحلقة تخرج.
* يُطبع محث <code>PS3</code> عند طباعة كل العناصر، وكذلك يٌقرأ أول سطر من المُدخلات، وإن احتوى هذا السطر على رقمٍ يطابق رقمَ أحد العناصر فإن قيمة <code>WORD</code> تتغير إلى اسم ذلك العنصر. وأما إن كان السطر فارغًا فإن العناصر -ومحث <code>PS3</code>- تعرض جميعًا مرة أخرى. أيضًا، إن قُرأ محرف <code>EOF</code> فإن الحلقة تخرج.
وبما أن أغلب المستخدمين لا يعرفون أي مجموعة مفاتيح تُستخدم لتسلسل EOF فإن استخدام أمر break كواحد من عناصر القائمة يكون أفضل. وعلى خلاف ما سبق فإن أي قيمة أخرى للسطر المقروء ستضبط قيمة متغير WORD لتكون نصًا فارغًا. ويُحفظ السطر في متغير REPLY.
وبما أن أغلب المستخدمين لا يعرفون أي مجموعة مفاتيح تُستخدم لتسلسل <code>EOF</code> فإن استخدام أمر <code>break</code> كواحد من عناصر القائمة يكون أفضل. وعلى خلاف ما سبق فإن أي قيمة أخرى للسطر المقروء ستضبط قيمة متغير <code>WORD</code> لتكون نصًا فارغًا. ويُحفظ السطر في متغير <code>REPLY</code>.


تُنفَّذ الأوامر المرتبطة (RESPECTIVE-COMMANDs) بعد كل اختيار إلى أن يُقرأ الرقم الممثل لأمر break.
تُنفَّذ الأوامر المرتبطة (<code>RESPECTIVE-COMMANDS</code>) بعد كل اختيار إلى أن يُقرأ الرقم الممثل لأمر <code>break</code>.


=== أمثلة ===
=== أمثلة ===
سطر 36: سطر 36:
You picked archive-20030129 (1)
You picked archive-20030129 (1)
#?
#?
</syntaxhighlight>لكن مع إعداد محث PS3 وإضافة احتمال للخروج فإن مظهر البرنامج السابق سيبدو أفضل، انظر المثال التالي:<syntaxhighlight lang="bash">
</syntaxhighlight>لكن مع إعداد محث <code>PS3</code> وإضافة احتمال للخروج فإن مظهر البرنامج السابق سيبدو أفضل، انظر المثال التالي:<syntaxhighlight lang="bash">
#!/bin/bash
#!/bin/bash


سطر 63: سطر 63:


== القوائم الفرعية ==
== القوائم الفرعية ==
يمكن لأي عبارة داخل بنية select أن تكون حلقة select جديدة، ما يؤدي إلى إيجاد قائمة فرعية أو أكثر داخل القائمة.ولا يتغير متغير PS3 افتراضيًا عند كتابة حلقة select متداخلة (nested)، أما إن كنت تريد محثًا مختلفًا في القائمة الفرعية فتأكد أن تضبطه في الوقت المناسب.
يمكن لأي عبارة داخل بنية <code>select</code> أن تكون حلقة <code>select</code> جديدة، ما يؤدي إلى إيجاد قائمة فرعية أو أكثر داخل القائمة.ولا يتغير متغير <code>PS3</code> افتراضيًا عند كتابة حلقة <code>select</code> متداخلة (nested)، أما إن كنت تريد محثًا مختلفًا في القائمة الفرعية فتأكد أن تضبطه في الوقت المناسب.


== انظر أيضًا ==
== انظر أيضًا ==

مراجعة 23:44، 10 أغسطس 2018


عام

استخدام أمر 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) رغم بساطته:

[hsoub@alaraby 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

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

انظر أيضًا

مصادر