تعلم مشغلات اختبار ملف Bash مع أمثلة

Bash مرنة للغاية وتوفر خيارات مختلفة لاختبار الملفات. وإذا كنت تبحث عن طريقة لاختبار الملفات الخاصة بك، فإن مشغلات اختبار الملفات في Bash ستأخذك إلى أماكن جديدة.

في هذا البرنامج التعليمي، ستتعرف على مشغلات اختبار الملفات المختلفة وكيفية استخدامها للاختبار ما إذا كان الملف موجودًا، قابلاً للقراءة، فارغًا، وما إلى ذلك.

استمر في القراءة وتعامل مع مشغلات اختبار الملفات في Bash!

متطلبات مسبقة

سيكون هذا البرنامج التعليمي عرضًا تطبيقيًا. إذا كنت ترغب في متابعته، تأكد من توفر ما يلي:

  • A Linux system with Bash installed – This tutorial uses Ubuntu 20.04.

معظم توزيعات Linux لديها Bash مثبتة بشكل افتراضي. ولكن إذا كنت تستخدم نظام Windows، يمكنك تثبيت نظام الأدوات الفرعية لنظام Linux (WSL) للحصول على واجهة سطر أوامر Bash.

  • A user account with sudo privileges to run commands as root – This tutorial uses a root account for simplicity. But using a non-root user with sudo access is always recommended.
  • يفترض هذا البرنامج التعليمي أن لديك وصول SSH إلى نظام Linux الخاص بك.

ما هي مشغلات اختبار ملف Bash؟

قبل أن تبدأ في استخدام مشغلات الاختبار، دعنا نلقي نظرة على كيفية عملها. تتيح لك مشغلات اختبار الملف اختبار جوانب مختلفة من ملف مثل ما إذا كان الملف موجودًا، قابل للقراءة/الكتابة، إلخ.

يمكن أن تساعد استخدام مشغلات اختبار الملف في منع الأخطاء في سيناريوهات البرمجة في Bash. الكود أدناه هو نموذج أساسي للبيان “if”. يعتبر بيان “if-else” أداة قوية ستراها كثيرًا في سيناريوهات برمجة Bash.

تذكر أن أقسام “then” و “else” في كتلة الكود ليستا إلزاميتين. يمكنك استخدام بيان “if” بدونهما.

# يمثل الملف الذي تريد اختباره.
# استبدل اسم_الملف بالاسم المستهدف للملف الذي تريد اختباره.
FILE="file_name"
# المشغل - مشغل اختبار الملف للاستخدام.
if [ Operator $FILE ]

then
 # المهام التي يجب تنفيذها إذا كان المشغل صحيحًا.
 do something

else
 # المهام التي يجب تنفيذها إذا كان المشغل غير صحيح.
 do something

fi

التحقق مما إذا كان الملف موجودًا

لقد رأيت لمحة عن كيفية عمل مشغلات الاختبار، لكن هذا لا يكفي لفهم الأمور الدقيقة في استخدامها. لذا، ابدأ بمثال أساسي، مثل التحقق مما إذا كان الملف موجودًا.

في العالم الحقيقي، قد ترغب في التحقق مما إذا كان ملف التكوين موجودًا قبل إنشائه. لا تريد إضاعة الوقت في بناء ملف تكوين من الصفر فقط لتكتشف أن نفس الملف موجود بالفعل.

للتحقق مما إذا كان الملف موجودًا بالفعل:

1. قم بفتح الطرفية الخاصة بك، وقم بتشغيل الأمر touch أدناه لإنشاء ملف test.txt جديد. هذا الأمر لا يقدم إخراجًا، ولكن ستتحقق من وجود الملف في الخطوة التالية.

touch test.txt

2. بعد ذلك، قم بتشغيل الأمر ls التالي لإدراج الملف الذي تم إنشاؤه حديثًا (test.txt) في دليل العمل الخاص بك.

ls -al test.txt

الإخراج أدناه يتحقق من أنك قمت بإنشاء ملف test.txt بنجاح.

الآن بعد أن لديك ملف اختبار، يمكنك استخدام كود القالب في نص برمجي Bash للتحقق مما إذا كان الملف موجودًا في الخطوات التالية.

Listing the newly-created file

3. قم بتشغيل الأمر أدناه لإنشاء (touch)، وفتح ملف نصي جديد (if_file_exists.sh) في محرر النص المفضل لديك (nano).

touch if_file_exists.sh && nano if_file_exists.sh

4. الآن، قم بتعبئة الكود أدناه في ملفك الجديد if_file_exists.sh ، ثم احفظ الملف وأغلق المحرر.

  • تشغيل عبارة if-else لاختبار ما إذا كان الملف المحدد موجودًا.
  • إذا كان المشغل يعيد القيمة صحيحة، ستحصل على رسالة تقول إن الملف موجود.
  • إذا كان المشغل يعيد القيمة صحيحة، ستحصل على رسالة تقول إن الملف غير موجود. ولكن هذه المرة، يتم إنشاء الملف تلقائيًا، باستخدام الاسم الذي حددته في متغير FILE.

السطر #!/bin/bash في أعلى الملف يعرف باسم shebang. تخبر shebang النظام بالمترجم الذي يجب استخدامه لتشغيل النص، في هذه الحالة، Bash. إذا لم تتضمن shebang، يستخدم النظام المترجم الافتراضي، الذي قد لا يكون Bash. غياب shebang يمكن أن يتسبب في فشل النص.

#!/bin/bash
# FILE - متغير يحمل قيمة الملف الذي تريد اختباره.
# يمكنك إعادة استخدام هذا الكود البرمجي لاختبار ملفات مختلفة 
  # عن طريق تغيير قيمة المتغير $FILE.
FILE="test.txt"

# المشغل -e يختبر وجود الملف
if [ -e $FILE ]
then
  # إذا كان المشغل يعيد القيمة صحيحة، قم بطباعة رسالة تقول إن الملف موجود.
  echo "$FILE exists"
else
  # إذا كان المشغل يعيد القيمة صحيحة، قم بطباعة رسالة تقول إن الملف غير موجود،
    # ثم قم بإنشاء الملف باستخدام الاسم الذي حددته في متغير FILE.
  echo "$FILE does not exist, creating new file" && touch test.txt
fi

5. قم بتشغيل الأمر التالي لتنفيذ النص الجديد الخاص بك (if_file_exists.sh)

bash if_file_exists.sh

إذا تم كل شيء على ما يرام، سترى رسالة وجود test.txt المطبوعة على الطرفية الخاصة بك، كما هو موضح أدناه.

test.txt exists

6. بعد ذلك، قم بتشغيل الأوامر التالية لحذف (rm -rf) ملف الاختبار (test.txt)، وقائمة جميع الملفات في دليل العمل الخاص بك.

rm -rf test.txt
ls test.txt

أدناه، يمكنك التحقق من أن test.txt لم يعد مدرجًا.

Deleting the test file

7. أعد تشغيل الأمر أدناه لتنفيذ نصك if_file_exists.sh.

نظرًا لأن ملف test.txt لم يعد موجودًا، يقوم النص بإنشاء ملف test.txt جديد عندما يعيد المشغل -e القيمة الخاطئة.

bash if_file_exists.sh
Rerun your if_file_exists.sh script

8. في النهاية، قم بتشغيل أمر ls أدناه لقائمة ملف test.txt في دليل العمل الخاص بك.

ls -al test.txt

تؤكد الناتج أدناه أن نصك قام بإنشاء ملف test.txt جديد.

Listing the new test.txt file

التحقق مما إذا كان ملفًا عاديًا أو ملفًا خاصًا

قبل فتح أو معالجة ملف، قد ترغب أولاً في التحقق مما إذا كان هذا الملف عاديًا أو خاصًا. لماذا؟ ملف خاص هو نوع من الملفات المخزنة في نظام الملفات، لذا كن حذرًا عند التعامل مع هذه الملفات.

على سبيل المثال، خطأ شائع عند فتح ملف خاص هو خطأ “لا يوجد ملف أو دليل”. يحدث هذا الخطأ عندما لا يكون الملف الذي تحاول فتحه موجودًا. ولكن يمكن أن يحدث نفس الخطأ أيضًا عند فتح ملف خاص بدلاً من ملف عادي.

افتح ملفًا جديدًا special_file.sh في محرر النص الخاص بك، أضف الشفرة التالية واحفظ التغييرات.

الشيفرة أدناه مماثلة للشيفرة السابقة. ولكن تستخدم هذه الشيفرة العامل -f بدلاً من العامل -e. يقوم العامل -f بفحص ما إذا كان الملف المحدد (/dev/vmmon) هو ملف عادي.

#!/bin/bash
# ملف /dev/vmmon هو ملف خاص
  # يُستخدم للتواصل مع أجهزة الأجهزة في نظام التشغيل لينكس.
FILE="/dev/vmmon"

# اختبر ما إذا كان الملف
if [ -f $FILE ]
then
  # إذا كان العامل يعود بقيمة صحيحة ، فستحصل على رسالة تقول
    # إن الملف هو ملف عادي.
  echo "$FILE is a regular file"

else
  # إذا كان العامل يعود بقيمة صحيحة ، فستحصل على رسالة تقول 
    # إن الملف إما لا يوجد أو هو ملف عادي.
  echo "Either $FILE does not exist or is not a regular file"

fi

الآن ، قم بتشغيل الأمر أدناه لتنفيذ سكريبت special_file.sh الخاص بك.

bash special_file.sh

نظرًا لأن الملف (/dev/vmmon) المحدد في متغير FILE هو ملف خاص ، ستحصل على الرسالة أدناه.

Checking if a file is a regular file

التحقق مما إذا كانت المجلد موجودة

حتى الآن ، تعلمت كيفية التحقق مما إذا كان ملف موجودًا. ولكن هل نفس الطريقة تنطبق على الدلائل؟ نعم ، باستخدام عامل الاختبار -d. يأتي هذا العامل بما فيه الكفاية إذا كنت تخطط لاتخاذ إجراء استنادًا إلى ما إذا كان المجلد موجودًا أم لا.

ربما تريد نسخ جميع الملفات من مجلد إلى آخر. إذا لم يكن المجلد المستهدف موجودًا ، يمكنك إنشاءه قبل نسخ الملفات.

1. قم بتشغيل أمر ls أدناه لعرض محتويات مجلد example-dir من داخل مجلد العمل.

ls -la example-dir

ستحصل على رسالة تقول “لا يوجد ملف أو دليل” نظرًا لعدم وجود المجلد. إذا كنت لا ترغب في توقف سير العمل فقط بسبب عدم وجود مجلد، انتقل إلى الخطوة التالية.

Listing the example-dir from the working directory

2. بعد ذلك، قم بفتح ملف جديد بالاسم if_dir_exists.sh في محرر النص الخاص بك، وأضف الكود أدناه واحفظ الملف. يقوم الكود التالي بفحص ما إذا كان مجلد محدد موجودًا ويقوم بأداء المهام اعتمادًا على قيمة عامل التشغيل -d التي يعيده.

يمكنك تحقيق نفس النتيجة عن طريق تبديل عبارات if و else باستخدام عامل النفي (!). في الحالات العملية، يمكن أن يساعد عامل النفي (!) في كتابة سيناريو نصي أنظف وأكثر إيجازًا.

#!/bin/bash
# قم بتعريف اسم المجلد في المتغير dir
dir=example_dir

# اختبر ما إذا كان المجلد (dir) موجودًا
if [ ! -d $dir ]
then
  # إذا كان المشغل يعيد قيمة صحيحة، قم بإنشاء مجلد وفقًا لقيمة المتغير dir
  mkdir $dir
  # انسخ ملف test.txt إلى المجلد الذي تم إنشاءه حديثًا
  cp test.txt $dir
  # يطبع رسالة حول المهام التي تم أداؤها أعلاه.
  echo "The directory has been created, and the test.txt file has been copied."
else
  # إذا كان المشغل يعيد قيمة كاذبة، 
    # يقوم أمر الطباعة بطباعة رسالة تقول أن المجلد موجود.
  echo "Directory $dir exists"
fi

3. الآن، قم بتشغيل الأمر أدناه لتنفيذ النصيب الخاص بك (if_dir_exists.sh)

bash if_dir_exists.sh

يمكنك رؤية الرسالة التي تقول إن المجلد قد تم إنشاؤه، وتم نسخ ملف test.txt نظرًا لعدم وجود مثال_المجلد.

Executing the if_dir_exists.sh to test if a directory exists

أخيرًا، قم بتشغيل أمر ls ضد مجلد المثال للتحقق من وجود المجلد واحتوائه على ملف test.txt.

ls -la example_dir
Confirming the example_dir directory exists and contains the test.txt file

التحقق مما إذا كان الملف فارغًا

أنت بالفعل تعرف كيفية استخدام أكثر ثلاثة مشغلات اختبار ملفات استخدامًا (-e, -f, و -d) لتعزيز مهارات البرمجة الخاصة بك. ولكن لا تزال هناك مشغلات أخرى تحب أن تبحث فيها.

عادةً ما تقوم بتشغيل أمر لنسخ محتويات ملف إلى ملف آخر بدلاً من تسليط الضوء على محتويات الملف. ولكن انتظر لحظة حيث أن ملف الهدف قد لا يكون فارغًا.

لماذا لا تستخدم المشغل -s للتحقق مما إذا كان الملف موجودًا وليس فارغًا؟ يُرجع هذا المشغل القيمة صحيحة إذا كان الملف موجودًا ولديه حجم أكبر من الصفر.

١. افتح ملفًا جديدًا بالاسم empty_file.sh في محرر النص الخاص بك، أضف الكود التالي، واحفظ الملف.

الكود التالي يختبر ما إذا كان الملف المحدد فارغًا ويطبع رسالة اعتمادًا على القيمة التي يُرجعها المشغل -s.

#!/bin/bash
# تعريف اسم الملف المستهدف
FILE=test.txt

# يختبر المشغل -s ما إذا كان الملف المستهدف موجودًا وليس فارغًا
if [ -s $FILE ]
then
  # إذا كان المشغل يعيد القيمة صحيحة، يقوم أمر الطباعة بطباعة رسالة
    # تقول أن الملف موجود وليس فارغ.
  echo "$FILE exists and is not empty"
else
  # إذا كان المشغل يعيد القيمة خاطئة، يقوم أمر الطباعة بطباعة رسالة 
    # تقول أن الملف إما غير موجود أو فارغ.
  echo "$FILE either does not exist or is empty"
  # إضافة نص إلى الملف المستهدف
  echo "This is a test. This is not an empty file" > $FILE
fi

2. الآن، قم بتشغيل الأمر أدناه لتنفيذ النصي (empty_file.sh).

bash empty_file.sh

أدناه، يمكنك رؤية الرسالة التي تقول أن test.txt إما غير موجود أو فارغ. ولكن في نفس الوقت، يقوم النص بإضافة نص إلى الملف test.txt.

Executing the empty_file.sh file to test if the text.txt file is empty

3. قم بتشغيل أمر cat أدناه للتحقق من أن ملف test.txt يحتوي على النص المضاف.

cat test.text
Verifying the text.txt file’s content

4. في الختام، قم بإعادة تشغيل الأمر bash أدناه لتنفيذ النصي empty_file.sh.

bash empty_file.sh

أدناه، يمكنك رؤية أن الإخراج تغير إلى test.txt موجود وليس فارغ نظرًا لأن الملف test.txt يحتوي الآن على بعض النص ولديه حجم أكبر من صفر (0).

Rerunning the empty_file.sh script to check if the test.txt file is empty

التحقق مما إذا كان الملف موجودًا وقابلاً للقراءة

ربما يتضمن أتمتة الخاص بك قراءة الملفات لأداء المهام. نجاح تلك المهام سيعتمد على ما إذا كانت الملفات قابلة للقراءة. كتابة نص للتحقق مما إذا كان ملف معين موجودًا وقابلًا للقراءة سيكون حلاً مفيدًا.

لتوضيح التحقق مما إذا كان الملف موجودًا وقابلًا للقراءة:

1. قم بتشغيل الأمر التالي لتسجيل الدخول إلى حساب مستخدم آخر (ata).

su - ata

يتغير سطر الأوامر الخاص بك ($) ليشير إلى أنك قد قمت بتسجيل الدخول باسم مستخدم آخر.

Logging in to another user account

بديلًا عن ذلك ، يمكنك تغيير إذن الملف إلى قابل للقراءة أو الكتابة أو كليهما باستخدام أمر chmod.

2. بمجرد تسجيل الدخول ، قم بإنشاء ملف جديد يسمى readable_file.sh باستخدام محرر النصوص الخاص بك

أضف الكود التالي إلى ملف readable_file.sh ، واحفظ التغييرات. يقوم هذا الكود بالتحقق مما إذا كان ملفًا يسمى test.txt في دليل /root موجودًا وقابلًا للقراءة.

#!/bin/bash
# حدد الملف المستهدف
FILE=test.txt

# اختبر ما إذا كان الملف المستهدف قابلًا للقراءة. 
# يمكنك تغيير -r إلى -w لاختبار ما إذا كان الملف قابلًا للكتابة بدلاً من ذلك.
if [ -r $FILE ] 
then  
  # إذا كانت العملية ترجع صحيحة ، قم بطباعة رسالة تقول
    # إن الملف موجود وقابل للقراءة.
  echo "$FILE exists and is readable" 
else  
  # إذا كانت العملية ترجع كاذبة ، قم بطباعة رسالة تقول
    # إن الملف إما غير موجود أو غير قابل للقراءة.  
  echo "$FILE does not exist or is unreadable"
fi

3. الآن ، قم بتشغيل الأمر أدناه لتنفيذ سكريبت readable_file.sh.

bash readable_file.sh

في هذه المرة، سترى رسالة تقول إن /root/test.txt غير موجود أو غير قابل للقراءة. بما أن ملف text.test موجود في دليل /root، فإن المستخدم الحالي (ata) لا يملك صلاحيات القراءة لملف text.txt

Executing the readable_file.sh script

. أخيراً، قم بتنفيذ الأوامر أدناه لأداء ما يلي:

  • تغيير ملف sudoers للسماح للمستخدم الحالي (ata) باستخدام sudo لتشغيل الأوامر المرتفعة.
  • تنفيذ سكريبت readable_file.sh، الذي يختبر إذا كان ملف معين قابل للقراءة.
sudo bash
bash readable_file.sh

يمكنك أن ترى أدناه أن الناتج يطبع أن test.txt موجود وقابل للقراءة لأن المستخدم ata أصبح الآن يملك صلاحية القراءة لملف test.txt.

Changing the sudoers file and executing the readable_file.sh script

خلاصة

A testing phase is always a priority before making drastic changes, whether on files or directories on your system. And in this tutorial, you’ve learned about the Bash file test operators and how to use them to test if a file (regular or special) or directory exists or if a file is readable or not.

مع هذه المهارات الجديدة، يمكنك أن تقرر بثقة أي إجراء يجب اتخاذه بناءً على نتيجة الاختبارات. ولكن هناك العديد من الطرق الأخرى التي يمكنك استخدامها لمشغلي اختبار ملفات Bash.

لم لا تجرب التحقق من امتداد ملف ما؟ أو ربما التحقق مما إذا كانت ملفات متعددة موجودة لمعرفة إذا كانت جميع الملفات التي تحتاجها متاحة؟

Source:
https://adamtheautomator.com/bash-file-test/