الفرق بين المراجعتين لصفحة: «Bash/introduction to if»
أسامه-دمراني (نقاش | مساهمات) إدخال 1.0، عنوان الصفحة |
أسامه-دمراني (نقاش | مساهمات) إدخال 2.0 إضافة محتوى |
||
سطر 1: | سطر 1: | ||
<noinclude>{{DISPLAYTITLE:مقدمة إلى if في Bash}}</noinclude> | <noinclude>{{DISPLAYTITLE:مقدمة إلى if في Bash}}</noinclude> | ||
== عام == | |||
قد تحتاج إلى تحديد سلاسل إجراءات مختلفة داخل برامج الصدفة (shell scripts) بناءً على نجاح تنفيذ أمر أو فشله، وتأتي أداة if الشرطية من أجل مثل تلك الحالات، وأصغر بنية لغوية لأمر if هي التالية:<syntaxhighlight lang="bash"> | |||
if TEST-COMMANDS; then CONSEQUENT-COMMANDS; fi | |||
</syntaxhighlight>تُنفَّذ قائمة أوامر الاختبار <code>TEST-COMMANDS</code>، ثم تُنفَّذ قائمة الأوامر التابعة <code>CONSEQUENT-COMMANDS</code> إن كانت حالة الإعادة لها هي صفر. وتكون حالة الإعادة هي حالة خروج آخر أمر تم تنفيذه، أو تكون صفرًا إن لم تتحقق أي حالة من أوامر الاختبار. | |||
يتضمن أمر الاختبار <code>TEST-COMMAND</code> في الغالب اختبارات مقارنات عددية أو نصية، لكن هذا لا يمنع أنه قد يكون أي أمر يُعيد حالة صفرية إذا نجح وحالة أخرى عند فشله، وتُستخدم التعبيرات الأحادية (Unary Expressions) في الغالب لاختبار حالة ملف ما، فإن كان وسيط <code>FILE</code> لأحد الأساسيات (primaries) على صيغة <code>dev/fd/N</code> فيُتفقَّد واصف الملف <code>N</code>. كذلك قد تُستخدم ملفات <code>stdin</code> و <code>stdout</code> و<code>stderr</code> وواصفات الملفات الخاصة بها -على الترتيب- في تلك الاختبارات. | |||
=== التعابير المستخدمة مع if === | |||
<span>يشتمل الجدول التالي </span>على ملخص لما يسمى بالأساسيات التي تكوِّن أمر الاختبار <code>TEST-COMMAND</code> أو قائمة أوامر الاختبار في بنية <code>if</code> الشرطية، وتوضع هذه الأساسيات بين أقواس مربعة لبيان اختبار التعبير الشرطي. | |||
'''جدول 7.1: التعابير الأساسية''' | |||
{| class="wikitable" | |||
!التعبير الأساسي | |||
!المعنى | |||
|- | |||
|<code>[ a FILE-]</code> | |||
|صحيح إن كان <code>FILE</code> موجودًا | |||
|- | |||
|<code>[ b FILE-]</code> | |||
|صحيح إن كان <code>FILE</code> موجودًا وكان ملفًا من نوع block-special. | |||
|- | |||
|<code>[ c FILE-]</code> | |||
|صحيح إن كان <code>FILE</code> موجودًا وكان ملفًا من نوع character-special. | |||
|- | |||
|<code>[ d FILE-]</code> | |||
|صحيح إن كان FILE موجودًا وكان مجلدًا. | |||
|- | |||
|<code>[ e FILE-]</code> | |||
|صحيح إن كان <code>FILE</code> موجودًا. | |||
|- | |||
|<code>[ f FILE-]</code> | |||
|صحيح إن كان <code>FILE</code> موجودًا وكان ملفًا عاديًا. | |||
|- | |||
|<code>[ g FILE-]</code> | |||
|صحيح إن كان <code>FILE</code> موجودًا وضُبِط بِتّ <code>SGID</code> فيه. | |||
|- | |||
|<code>[ h FILE-]</code> | |||
|صحيح إن كان <code>FILE</code> موجودًا وكان رابطًا رمزيًا (symbolic link) | |||
|- | |||
|<code>[ k FILE-]</code> | |||
|صحيح إن كان <code>FILE</code> موجودًا وضُبط البِتّ اللزج (sticky bit) فيها. | |||
|- | |||
|<code>[ p FILE-]</code> | |||
|صحيح إن كان <code>FILE</code> موجودًا وكان أنبوبًا مُسمَّى (FIFO). | |||
|- | |||
|<code>[ r FILE-]</code> | |||
|صحيح إن كان <code>FILE</code> موجودًا ويمكن قراءته (Readable). | |||
|- | |||
|<code>[ s FILE-]</code> | |||
|صحيح إن كان <code>FILE</code> موجودًا وحجمه أكبر من الصفر. | |||
|- | |||
|<code>[ t FD-]</code> | |||
|صحيح إن كان واصف الملف <code>FD</code> مفتوحًا ويشير إلى الطرفية. | |||
|- | |||
|<code>[ u FILE-]</code> | |||
|صحيح إن كان <code>FILE</code> موجودًا وضُبط بتّ <code>SUID</code> (ضبط معرِّف المستخدم Set User ID) | |||
|- | |||
|<code>[ w FILE-]</code> | |||
|صحيح إن كان <code>FILE</code> موجودًا ويمكن الكتابة فيه (writable). | |||
|- | |||
|<code>[ x FILE-]</code> | |||
|صحيح إن كان <code>FILE</code> موجودًا ويمكن تنفيذه (executable). | |||
|- | |||
|<code>[ O FILE-]</code> | |||
|صحيح إن كان <code>FILE</code> موجودًا ويملكه معرِّف مستخدم فعَّال (effective user ID). | |||
|- | |||
|<code>[ G FILE-]</code> | |||
|صحيح إن كان <code>FILE</code> موجودًا ويملكه معرِّف مجموعة فعَّال (effective group ID). | |||
|- | |||
|<code>[ L FILE-]</code> | |||
|صحيح إن كان <code>FILE</code> موجودًا وكان رابطًا رمزيًا (symbolic link). | |||
|- | |||
|<code>[ N FILE-]</code> | |||
|صحيح إن كان <code>FILE</code> موجودُا وحدثت فيه تعديلات بعد آخر مرة قُرأ فيها. | |||
|- | |||
|<code>[ S FILE-]</code> | |||
|صحيح إن كان <code>FILE</code> موجودًا وكان مقبسًا (socket) -المقبس هو قناة لنقل بيانات تظهر كملف للبرنامج الذي يستخدمها-. | |||
|- | |||
|<code>[ FILE1 -ntFILE2 ]</code> | |||
|صحيح إن تم تعديل <code>FILE1</code> بعد <code>FILE2</code>، أو إن كان <code>FILE1</code> موجودًا و <code>FILE2</code> غير موجود. | |||
|- | |||
|<code>[ FILE1 -otFILE2 ]</code> | |||
|صحيح إن كان <code>FILE1</code> أقدم من <code>FILE2</code>، أو كان <code>FILE2</code> موجودًا و<code>FILE1</code> غير موجود. | |||
|- | |||
|<code>[ FILE1 -ef FILE2 ]</code> | |||
|صحيح إن كان <code>FILE1</code> و <code>FILE2</code> يشيران إلى نفس أرقام الجهاز (device) ومؤشر الفهرسة (inode). | |||
|- | |||
|<code>[ o OPTIONNAME- ]</code> | |||
|صحيح إن كان خيار <code>OPTIONNAME</code> مفعَّلًا. | |||
|- | |||
|<code>[ z OPTIONNAME- ]</code> | |||
|صحيح إن كان طول <code>STRING</code> يساوي صفرًا. | |||
|- | |||
|<code>[ n STRING- ]</code> أو <code>[ STRING ]</code> | |||
|صحيح إن كان طول <code>STRING</code> لا يساوي صفرًا. | |||
|- | |||
|<code>[ STRING1 == STRING2 ]</code> | |||
|صحيح إن كانت المقاطع النصية (strings) متساوية. قد تُستخدم <code>=</code> بدلًا من <code>==</code> لضمان الالتزام بمعايير POSIX. | |||
|- | |||
|<code>[ STRING1 != STRING2 ]</code> | |||
|صحيح إن كانت المقاطع النصية غير متساوية. | |||
|- | |||
|<code>[ STRING1 < STRING2 ]</code> | |||
|صحيح إن صُنِّف <code>STRING1</code> قبل <code>STRING2</code> بشكل معجمي في الإعدادات المحلية الحالية. | |||
|- | |||
|<code>[ STRING1 > STRING2 ]</code> | |||
|صحيح إن صُنِّف <code>STRING1</code> بعد <code>STRING2</code> بشكل معجمي في الإعدادات المحلية الحالية. | |||
|- | |||
|<code>[ ARG1 OP ARG2 ]</code> | |||
|<code>OP</code> هو أحد المعامِلات الحسابية الثنائية التالية: <code>eq-</code> أو <code>ne-</code> أو <code>lt-</code> أو <code>le-</code> أو <code>gt-</code> أو <code>ge-</code>، وتعيد تلك المعامِلات حالة صحيحة (true) إن كان <code>ARG1</code> يساوي، أو لا يساوي، أو أقل من، أو أقل من أو يساوي، أو أكبر من، أو أكبر من أو يساوي <code>ARG2</code>، على الترتيب. و<code>ARG1</code> و <code>ARG2</code> هما أعداد صحيحة. | |||
|} | |||
قد تُدمج التعابير باستخدام المعامِلات التالية مرتبة بأولوية تناقصية: | |||
'''جدول 7.2: دمج التعابير''' | |||
{| class="wikitable" | |||
!العملية | |||
!الأثر | |||
|- | |||
|<code>[ EXPR ! ]</code> | |||
|صحيح إن كان <code>EXPR</code> خطأ. | |||
|- | |||
|<code>[ ( EXPR ) ]</code> | |||
|يعيد قيمة <code>EXPR</code>، قد يُستخدم هذا لإلغاء الأولوية الطبيعية للمعامِلات. | |||
|- | |||
|<code>[ EXPR1 -a EXPR2 ]</code> | |||
|صحيح إن كان كل من <code>EXPR1</code> و <code>EXPR2</code> صحيحين. | |||
|- | |||
|<code>[ EXPR1 -o EXPR2 ]</code> | |||
|صحيح إن كان <code>EXPR1</code> صحيحًا أو كان <code>EXPR2</code> صحيحًا، أحدهما يكفي. | |||
|} |
مراجعة 22:09، 26 أغسطس 2018
عام
قد تحتاج إلى تحديد سلاسل إجراءات مختلفة داخل برامج الصدفة (shell scripts) بناءً على نجاح تنفيذ أمر أو فشله، وتأتي أداة if الشرطية من أجل مثل تلك الحالات، وأصغر بنية لغوية لأمر if هي التالية:
if TEST-COMMANDS; then CONSEQUENT-COMMANDS; fi
تُنفَّذ قائمة أوامر الاختبار TEST-COMMANDS
، ثم تُنفَّذ قائمة الأوامر التابعة CONSEQUENT-COMMANDS
إن كانت حالة الإعادة لها هي صفر. وتكون حالة الإعادة هي حالة خروج آخر أمر تم تنفيذه، أو تكون صفرًا إن لم تتحقق أي حالة من أوامر الاختبار.
يتضمن أمر الاختبار TEST-COMMAND
في الغالب اختبارات مقارنات عددية أو نصية، لكن هذا لا يمنع أنه قد يكون أي أمر يُعيد حالة صفرية إذا نجح وحالة أخرى عند فشله، وتُستخدم التعبيرات الأحادية (Unary Expressions) في الغالب لاختبار حالة ملف ما، فإن كان وسيط FILE
لأحد الأساسيات (primaries) على صيغة dev/fd/N
فيُتفقَّد واصف الملف N
. كذلك قد تُستخدم ملفات stdin
و stdout
وstderr
وواصفات الملفات الخاصة بها -على الترتيب- في تلك الاختبارات.
التعابير المستخدمة مع if
يشتمل الجدول التالي على ملخص لما يسمى بالأساسيات التي تكوِّن أمر الاختبار TEST-COMMAND
أو قائمة أوامر الاختبار في بنية if
الشرطية، وتوضع هذه الأساسيات بين أقواس مربعة لبيان اختبار التعبير الشرطي.
جدول 7.1: التعابير الأساسية
التعبير الأساسي | المعنى |
---|---|
[ a FILE-]
|
صحيح إن كان FILE موجودًا
|
[ b FILE-]
|
صحيح إن كان FILE موجودًا وكان ملفًا من نوع block-special.
|
[ c FILE-]
|
صحيح إن كان FILE موجودًا وكان ملفًا من نوع character-special.
|
[ d FILE-]
|
صحيح إن كان FILE موجودًا وكان مجلدًا. |
[ e FILE-]
|
صحيح إن كان FILE موجودًا.
|
[ f FILE-]
|
صحيح إن كان FILE موجودًا وكان ملفًا عاديًا.
|
[ g FILE-]
|
صحيح إن كان FILE موجودًا وضُبِط بِتّ SGID فيه.
|
[ h FILE-]
|
صحيح إن كان FILE موجودًا وكان رابطًا رمزيًا (symbolic link)
|
[ k FILE-]
|
صحيح إن كان FILE موجودًا وضُبط البِتّ اللزج (sticky bit) فيها.
|
[ p FILE-]
|
صحيح إن كان FILE موجودًا وكان أنبوبًا مُسمَّى (FIFO).
|
[ r FILE-]
|
صحيح إن كان FILE موجودًا ويمكن قراءته (Readable).
|
[ s FILE-]
|
صحيح إن كان FILE موجودًا وحجمه أكبر من الصفر.
|
[ t FD-]
|
صحيح إن كان واصف الملف FD مفتوحًا ويشير إلى الطرفية.
|
[ u FILE-]
|
صحيح إن كان FILE موجودًا وضُبط بتّ SUID (ضبط معرِّف المستخدم Set User ID)
|
[ w FILE-]
|
صحيح إن كان FILE موجودًا ويمكن الكتابة فيه (writable).
|
[ x FILE-]
|
صحيح إن كان FILE موجودًا ويمكن تنفيذه (executable).
|
[ O FILE-]
|
صحيح إن كان FILE موجودًا ويملكه معرِّف مستخدم فعَّال (effective user ID).
|
[ G FILE-]
|
صحيح إن كان FILE موجودًا ويملكه معرِّف مجموعة فعَّال (effective group ID).
|
[ L FILE-]
|
صحيح إن كان FILE موجودًا وكان رابطًا رمزيًا (symbolic link).
|
[ N FILE-]
|
صحيح إن كان FILE موجودُا وحدثت فيه تعديلات بعد آخر مرة قُرأ فيها.
|
[ S FILE-]
|
صحيح إن كان FILE موجودًا وكان مقبسًا (socket) -المقبس هو قناة لنقل بيانات تظهر كملف للبرنامج الذي يستخدمها-.
|
[ FILE1 -ntFILE2 ]
|
صحيح إن تم تعديل FILE1 بعد FILE2 ، أو إن كان FILE1 موجودًا و FILE2 غير موجود.
|
[ FILE1 -otFILE2 ]
|
صحيح إن كان FILE1 أقدم من FILE2 ، أو كان FILE2 موجودًا وFILE1 غير موجود.
|
[ FILE1 -ef FILE2 ]
|
صحيح إن كان FILE1 و FILE2 يشيران إلى نفس أرقام الجهاز (device) ومؤشر الفهرسة (inode).
|
[ o OPTIONNAME- ]
|
صحيح إن كان خيار OPTIONNAME مفعَّلًا.
|
[ z OPTIONNAME- ]
|
صحيح إن كان طول STRING يساوي صفرًا.
|
[ n STRING- ] أو [ STRING ]
|
صحيح إن كان طول STRING لا يساوي صفرًا.
|
[ STRING1 == STRING2 ]
|
صحيح إن كانت المقاطع النصية (strings) متساوية. قد تُستخدم = بدلًا من == لضمان الالتزام بمعايير POSIX.
|
[ STRING1 != STRING2 ]
|
صحيح إن كانت المقاطع النصية غير متساوية. |
[ STRING1 < STRING2 ]
|
صحيح إن صُنِّف STRING1 قبل STRING2 بشكل معجمي في الإعدادات المحلية الحالية.
|
[ STRING1 > STRING2 ]
|
صحيح إن صُنِّف STRING1 بعد STRING2 بشكل معجمي في الإعدادات المحلية الحالية.
|
[ ARG1 OP ARG2 ]
|
OP هو أحد المعامِلات الحسابية الثنائية التالية: eq- أو ne- أو lt- أو le- أو gt- أو ge- ، وتعيد تلك المعامِلات حالة صحيحة (true) إن كان ARG1 يساوي، أو لا يساوي، أو أقل من، أو أقل من أو يساوي، أو أكبر من، أو أكبر من أو يساوي ARG2 ، على الترتيب. وARG1 و ARG2 هما أعداد صحيحة.
|
قد تُدمج التعابير باستخدام المعامِلات التالية مرتبة بأولوية تناقصية:
جدول 7.2: دمج التعابير
العملية | الأثر |
---|---|
[ EXPR ! ]
|
صحيح إن كان EXPR خطأ.
|
[ ( EXPR ) ]
|
يعيد قيمة EXPR ، قد يُستخدم هذا لإلغاء الأولوية الطبيعية للمعامِلات.
|
[ EXPR1 -a EXPR2 ]
|
صحيح إن كان كل من EXPR1 و EXPR2 صحيحين.
|
[ EXPR1 -o EXPR2 ]
|
صحيح إن كان EXPR1 صحيحًا أو كان EXPR2 صحيحًا، أحدهما يكفي.
|