روابط سريعة
إذا كان برنامج نصي Linux Bash يعتمد على وجود ملفات أو أدلة معينة، فلا يمكنه افتراض ذلك ببساطة. بل يحتاج إلى التحقق من وجودها بالتأكيد. وإليك كيفية القيام بذلك.
لا تفترض أي شيء
عندما تكتب نصًا برمجيًا، لا يمكنك تكوين افتراضات حول ما هو موجود وما هو غير موجود على جهاز الكمبيوتر. وينطبق هذا بشكل مضاعف إذا كان النص البرمجي سيتم توزيعه وتشغيله على العديد من أجهزة الكمبيوتر المختلفة. عاجلاً أم آجلاً، سيتم تشغيل النص البرمجي على جهاز كمبيوتر لا يفي بافتراضاتك، وسيفشل النص البرمجي أو يعمل بشكل غير متوقع.
يتم تخزين كل ما نقدره أو ننشئه على جهاز الكمبيوتر في ملف بتنسيق ما، وتوجد كل هذه الملفات في دليل. يمكن للبرامج النصية قراءة الملفات والدلائل وكتابتها وإعادة تسميتها وحذفها ونقلها — كل الأشياء التي يمكنك القيام بها على سطر الأوامر.
الميزة التي تتمتع بها كإنسان هي أنه يمكنك رؤية محتويات الدليل ومعرفة ما إذا كان الملف موجودًا أم لا – أو ما إذا كان الدليل المتوقع موجودًا أم لا. إذا أخطأ البرنامج النصي أثناء معالجته للملفات، فقد يؤدي ذلك إلى نتائج خطيرة ومدمرة.
توفر Bash مجموعة شاملة من الاختبارات التي يمكنك استخدامها لاكتشاف الملفات والدلائل واختبار العديد من سماتها. يعد دمج هذه الاختبارات في البرامج النصية أمرًا سهلاً، ولكن الفوائد من حيث المتانة والتحكم الدقيق كبيرة.
مجموعة الاختبارات
من خلال الجمع بين عبارة if والاختبار المناسب من مجموعة كبيرة من اختبارات الملفات والدليل، يمكننا بسهولة تحديد ما إذا كان الملف موجودًا، وما إذا كان قابلاً للتنفيذ، أو قابلاً للكتابة، وأكثر من ذلك بكثير.
- -ب:ترجع قيمة true إذا كان الملف عبارة عن ملف كتلة خاص.
- -ج:ترجع قيمة true إذا كان الملف خاصًا بالأحرف.
- -د:ترجع قيمة true إذا كان “الملف” عبارة عن دليل.
- -هـ:يرجع صحيحًا إذا كان الملف موجودًا.
- -ف:ترجع قيمة true إذا كان الملف موجودًا وكان ملفًا عاديًا.
- -ج:ترجع القيمة true إذا كان الملف يحتوي على
setgid
مجموعة الأذونات (
chmod g+
).
- -ح:يرجع صحيحًا إذا كان الملف رابطًا رمزيًا.
- -ل:يرجع صحيحًا إذا كان الملف رابطًا رمزيًا.
- -ك:ترجع القيمة true إذا تم تعيين البت اللاصق الخاص بها (
chmod +t
).
- -ص:ترجع قيمة true إذا كان الملف عبارة عن أنبوب مسمى.
- -ر:يرجع صحيحًا إذا كان الملف قابلاً للقراءة.
- -س:ترجع قيمة true إذا كانت الملفات موجودة وليست فارغة.
- -س:ترجع قيمة true إذا كان الملف عبارة عن مقبس.
- -ت:ترجع قيمة true إذا تم فتح موصوف الملف في محطة طرفية.
- -و:ترجع القيمة true إذا كان الملف يحتوي على
setuid
مجموعة الأذونات (
chmod u+
).
- -و:يرجع صحيحًا إذا كان الملف قابلاً للكتابة.
- -x:ترجع قيمة true إذا كان الملف قابلاً للتنفيذ.
- -ا:ترجع قيمة true إذا كانت مملوكة لك.
- -ج:يرجع صحيحًا إذا كانت مملوكة لمجموعتك.
- -ن:ترجع قيمة true إذا تم تعديل الملف منذ قراءته آخر مرة.
- !:المشغل المنطقي NOT.
- &&:المشغل المنطقي AND.
- ||:المشغل المنطقي OR.
القائمة تبدأ بـ
-b
لأن
-a
تم إلغاء الاختبار واستبداله بـ
-e
امتحان.
استخدام الاختبارات في البرامج النصية
اختبار الملف العام if
العبارة عبارة عن بنية نصية بسيطة. المقارنة داخل الأقواس المزدوجة ”
(( ))
“يستخدم” -f
اختبار لتحديد ما إذا كان هناك ملف عادي يحمل هذا الاسم.
انسخ نص هذا البرنامج النصي إلى محرر واحفظه في ملف يسمى “script1.sh”، واستخدم
chmod
لجعله قابلا للتنفيذ.
#!/bin/bashif (( -f $1 ))
then
echo "The file $1 exists."
else
echo "The file $1 cannot be found."
fi
يتعين عليك تمرير اسم الملف إلى البرنامج النصي على سطر الأوامر.
chmod +x script1.sh
سيتعين عليك القيام بذلك مع كل نص برمجي إذا كنت تريد تجربة الأمثلة الأخرى من المقالة.
دعنا نحاول تجربة البرنامج النصي على ملف نصي بسيط.
./script1.sh test-file.txt
الملف موجود ويقوم البرنامج النصي بإبلاغ هذه الحقيقة بشكل صحيح. إذا حذفنا الملف وحاولنا مرة أخرى، فيجب أن يفشل الاختبار ويجب أن يقوم البرنامج النصي بإبلاغنا بذلك.
./script1.sh test-file.txt
في موقف حقيقي، سيحتاج البرنامج النصي الخاص بك إلى اتخاذ أي إجراء مناسب. ربما يقوم بتمييز الخطأ ويتوقف. ربما يقوم بإنشاء الملف ويستمر. ربما ينسخ شيئًا من دليل النسخ الاحتياطي لاستبدال الملف المفقود. كل هذا يتوقف على الغرض من البرنامج النصي. ولكن على الأقل الآن أصبح البرنامج النصي قادرًا على اتخاذ القرار بناءً على معرفة ما إذا كان الملف موجودًا أم لا.
ال -f
يختبر العلم ما إذا كان الملف موجودًا، وما إذا كان ملفًا “عاديًا”. بعبارة أخرى، ليس شيئًا يبدو وكأنه ملف ولكنه ليس كذلك، مثل ملف جهاز.
سنستخدم ls للتأكد من وجود الملف “/dev/random”، ثم نرى ما يفعله البرنامج النصي به.
ls -lh /dev/random
./script /dev/random
نظرًا لأن البرنامج النصي الخاص بنا يختبر الملفات العادية و”/dev/random” هو ملف جهاز، فإن الاختبار يفشل. في كثير من الأحيان، للوصول إلى حقيقة وجود ملف ما، يتعين عليك اختيار الاختبار الذي تستخدمه بعناية، أو يتعين عليك استخدام عدة اختبارات.
هذا هو “script2.sh”، الذي يقوم باختبار الملفات العادية وملفات أجهزة الأحرف.
#!/bin/bashif (( -f $1 ))
then
echo "The file $1 exists."
else
echo "The file $1 is missing or not a regular file."
fi
if (( -c $1 ))
then
echo "The file $1 is a character device file."
else
echo "The file $1 is missing or not a special file."
fi
إذا قمنا بتشغيل هذا البرنامج النصي على ملف الجهاز “/dev/random”، فإن الاختبار الأول يفشل وهو ما نتوقعه، وينجح الاختبار الثاني. فهو يتعرف على الملف كملف جهاز.
./script2.sh /dev/random
في الواقع، يتعرف عليه البرنامج كملف جهاز حرفي. بعض ملفات الجهاز عبارة عن ملفات جهاز كتلة. في الوضع الحالي، لن يتعامل البرنامج النصي الخاص بنا مع هذه الملفات.
./script2.sh /dev/sda
يمكننا الاستفادة من المنطقية OR
عامل التشغيل ويتضمن اختبارًا آخر في عبارة if الثانية. هذه المرة، سواء كان الملف ملف جهاز حرفي أو ملف جهاز كتلة، فإن الاختبار سيرجع القيمة true. هذا هو “script3.sh”.
#!/bin/bashif (( -f $1 ))
then
echo "The file $1 exists."
else
echo "The file $1 is missing or not a regular file."
fi
if (( -c $1 || -b $1 ))
then
echo "The file $1 is a character or block device file."
else
echo "The file $1 is missing or not a special file."
fi
يتعرف هذا البرنامج النصي على كل من ملفات جهاز الأحرف وملفات جهاز الكتلة.
./script3.sh /dev/random
./script3.sh /dev/sda
إذا كان من المهم بالنسبة لك التمييز بين الأنواع المختلفة من ملفات الجهاز، فيمكنك استخدام ملفات متداخلة if
هذه هي “script4.sh”.
#!/bin/bashif (( -f $1 ))
then
echo "The file $1 exists."
else
echo "The file $1 is missing or not a regular file."
fi
if (( -c $1 ))
then
echo "The file $1 is a character device file."
else
if (( -b $1 ))
then
echo "The file $1 is a block device file."
else
echo "The file $1 is missing or not a device file."
fi
fi
يتعرف هذا البرنامج النصي على ملفات جهاز الأحرف وجهاز الكتلة ويقوم بتصنيفها.
./script4.sh /dev/random
./script4.sh /dev/sda
باستخدام عامل AND المنطقي، يمكننا اختبار عدة خصائص في وقت واحد. هذا هو “script5.sh”. يتحقق من وجود ملف وأن البرنامج النصي لديه أذونات القراءة والكتابة له.
#!/bin/bashif (( -f $1 && -r $1 && -w $1 ))
then
echo "The file $1 exists and we have read/write permissions."
else
echo "The file $1 is missing, not a regular file, or we can't read/write to it."
fi
سنقوم بتشغيل البرنامج النصي على ملف ينتمي إلينا، وملف ينتمي إلى root
.
./script5.sh .bashrc
./script5.sh /etc/fstab
لاختبار وجود الدليل، استخدم -d
هذا هو “script6.sh”. وهو جزء من البرنامج النصي الاحتياطي. أول شيء يفعله هو التحقق مما إذا كان الدليل الذي تم تمريره على سطر الأوامر موجودًا أم لا. ويستخدم الدليل المنطقي NOT
المشغل !
في if
اختبار العبارة.
#!/bin/bashif (( ! -d $1 ))
then
echo "Creating backup directory:" $1
mkdir $1
if (( ! $? -eq 0 ))
then
echo "Couldn't create backup directory:" $1
exit
fi
else
echo "Backup directory exists."
fi
# continue with file backup
echo "Backing up to: "$1
إذا لم يكن الدليل موجودًا، فإنه يقوم بإنشائه. إذا تم حفظ ملفات إنشاء الدليل، يخرج البرنامج النصي. إذا نجح إنشاء الدليل، أو كان الدليل موجودًا بالفعل، يستمر البرنامج النصي في إجراءات النسخ الاحتياطي الخاصة به.
سنقوم بتشغيل البرنامج النصي ثم نتحقق منه ls
و ال -d
(الدليل) خيار ما إذا كان دليل النسخ الاحتياطي موجودًا.
./script6.sh Documents/project-backup
ls -d Documents/project-backup
تم إنشاء دليل النسخ الاحتياطي. إذا قمنا بتشغيل البرنامج النصي مرة أخرى، فيجب أن يبلغك أن الدليل موجود بالفعل.
./script6.sh
يقوم البرنامج النصي بالعثور على الدليل والانتقال إلى إجراء النسخ الاحتياطي.
اختبار، لا تفترض
عاجلاً أم آجلاً، ستؤدي الافتراضات إلى حدوث أشياء سيئة. اختبر أولاً، ثم تصرف وفقًا لذلك.
المعرفة قوة. استخدم الاختبارات لتزويد نصوصك بالمعرفة التي تحتاجها.