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

من موسوعة حسوب
إدخال 1.0، عنوان الصفحة
 
مراجعة 6: إضافة تصانيف وتعديل اسم مستخدم الطرفية.
 
(4 مراجعات متوسطة بواسطة نفس المستخدم غير معروضة)
سطر 1: سطر 1:
<noinclude>{{DISPLAYTITLE:إنشاء قوائم باستخدام الأمر المُضمَّن select في Bash}}</noinclude>
<noinclude>{{DISPLAYTITLE:إنشاء قوائم باستخدام الأمر المُضمَّن select في Bash}}</noinclude>
== عام ==
=== استخدام أمر select ===
البُنية اللغوية لأمر <code>select</code> تشبه بُنية حلقة <code>for</code>:<syntaxhighlight lang="bash">
select WORD [in LIST]; do RESPECTIVE-COMMANDS; done
</syntaxhighlight>ويُستخدم أمر <code>select</code> من أجل إنشاء قوائم بسهولة عبر اتباع ما يلي:
* تُوسّع القائمة <code>LIST</code> مولِّدة قائمة من العناصر ويطبع التوسع في خطأ قياسي (standard error)، كما يُسبق كل عنصر من القائمة برقم. وإن لم تكن <code>in LIST</code> موجودة فتُطبع المعامِلات الموضعية كما لو تم تحديد <code>@$ in</code>. أيضًا، تُطبع قائمة <code>LIST</code> مرة واحدة فقط.
* يُطبع محث <code>PS3</code> عند طباعة كل العناصر، وكذلك يٌقرأ أول سطر من المُدخلات، وإن احتوى هذا السطر على رقمٍ يطابق رقمَ أحد العناصر فإن قيمة <code>WORD</code> تتغير إلى اسم ذلك العنصر. وأما إن كان السطر فارغًا فإن العناصر -ومحث <code>PS3</code>- تعرض جميعًا مرة أخرى. أيضًا، إن قُرأ محرف <code>EOF</code> فإن الحلقة تخرج.
وبما أن أغلب المستخدمين لا يعرفون أي مجموعة مفاتيح تُستخدم لتسلسل <code>EOF</code> فإن استخدام أمر <code>break</code> كواحد من عناصر القائمة يكون أفضل. وعلى خلاف ما سبق فإن أي قيمة أخرى للسطر المقروء ستضبط قيمة متغير <code>WORD</code> لتكون نصًا فارغًا. ويُحفظ السطر في متغير <code>REPLY</code>.
تُنفَّذ الأوامر المرتبطة (<code>RESPECTIVE-COMMANDS</code>) بعد كل اختيار إلى أن يُقرأ الرقم الممثل لأمر <code>break</code>.
=== أمثلة ===
المثال التالي ليس صديقًا للمستخدم (user-friendly) رغم بساطته:<syntaxhighlight lang="bash">
[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)
#?
</syntaxhighlight>لكن مع إعداد محث <code>PS3</code> وإضافة احتمال للخروج فإن مظهر البرنامج السابق سيبدو أفضل، انظر المثال التالي:<syntaxhighlight lang="bash">
#!/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"
</syntaxhighlight>
== القوائم الفرعية ==
يمكن لأي عبارة داخل بنية <code>select</code> أن تكون حلقة <code>select</code> جديدة، ما يؤدي إلى إيجاد قائمة فرعية أو أكثر داخل القائمة.ولا يتغير متغير <code>PS3</code> افتراضيًا عند كتابة حلقة <code>select</code> متداخلة (nested)، أما إن كنت تريد محثًا مختلفًا في القائمة الفرعية فتأكد أن تضبطه في الوقت المناسب.
== انظر أيضًا ==
* [[Bash/creating and running a script|إنشاء وتشغيل برامج Bash]].
* [[Bash/script basics|أساسيات كتابة برامج Bash]].
== مصادر ==
* [http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_09_06.html دليل Bash للمبتدئين، صفحة إنشاء قوائم بأمر select].
[[تصنيف:Bash]]
[[تصنيف:Bash Making Menus]]
[[تصنيف:Bash Select Built-in]]
[[تصنيف:Bash Expansion]]

المراجعة الحالية بتاريخ 00:41، 7 سبتمبر 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) رغم بساطته:

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

انظر أيضًا

مصادر