مقدمة إلى if في Bash

من موسوعة حسوب
مراجعة 22:09، 26 أغسطس 2018 بواسطة أسامه-دمراني (نقاش | مساهمات) (إدخال 2.0 إضافة محتوى)


عام

قد تحتاج إلى تحديد سلاسل إجراءات مختلفة داخل برامج الصدفة (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 صحيحًا، أحدهما يكفي.