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