كيفية التحقق من وجود ملف في نصوص Bash في Linux

إذا كان برنامج نصي Linux Bash يعتمد على وجود ملفات أو أدلة معينة، فلا يمكنه افتراض ذلك ببساطة. بل يحتاج إلى التحقق من وجودها بالتأكيد. وإليك كيفية القيام بذلك.




لا تفترض أي شيء

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

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

الميزة التي تتمتع بها كإنسان هي أنه يمكنك رؤية محتويات الدليل ومعرفة ما إذا كان الملف موجودًا أم لا – أو ما إذا كان الدليل المتوقع موجودًا أم لا. إذا أخطأ البرنامج النصي أثناء معالجته للملفات، فقد يؤدي ذلك إلى نتائج خطيرة ومدمرة.


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

ذات صلة: كيفية استخدام اختبارات الشرط ذات الأقواس المزدوجة في Linux

مجموعة الاختبارات

من خلال الجمع بين عبارة 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 

امتحان.

ذات صلة: كيفية استخدام SUID وSGID وSticky Bits على Linux

استخدام الاختبارات في البرامج النصية

اختبار الملف العام if العبارة عبارة عن بنية نصية بسيطة. المقارنة داخل الأقواس المزدوجة ”

(( )) 

“يستخدم” -f اختبار لتحديد ما إذا كان هناك ملف عادي يحمل هذا الاسم.

انسخ نص هذا البرنامج النصي إلى محرر واحفظه في ملف يسمى “script1.sh”، واستخدم

chmod 

لجعله قابلا للتنفيذ.

#!/bin/bash

if (( -f $1 ))

then

  echo "The file $1 exists."

else

  echo "The file $1 cannot be found."

fi

يتعين عليك تمرير اسم الملف إلى البرنامج النصي على سطر الأوامر.

chmod +x script1.sh

جعل البرنامج النصي قابلاً للتنفيذ باستخدام chmod


سيتعين عليك القيام بذلك مع كل نص برمجي إذا كنت تريد تجربة الأمثلة الأخرى من المقالة.

دعنا نحاول تجربة البرنامج النصي على ملف نصي بسيط.

./script1.sh test-file.txt

تشغيل script1.sh على ملف عادي

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

./script1.sh test-file.txt

تشغيل script1.sh على ملف غير موجود


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

ال -f يختبر العلم ما إذا كان الملف موجودًا، وما إذا كان ملفًا “عاديًا”. بعبارة أخرى، ليس شيئًا يبدو وكأنه ملف ولكنه ليس كذلك، مثل ملف جهاز.

سنستخدم ls للتأكد من وجود الملف “/dev/random”، ثم نرى ما يفعله البرنامج النصي به.

ls -lh /dev/random

./script /dev/random

تشغيل script1.sh على ملف الجهاز


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

هذا هو “script2.sh”، الذي يقوم باختبار الملفات العادية وملفات أجهزة الأحرف.

#!/bin/bash

if (( -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 على ملف جهاز حرفي


في الواقع، يتعرف عليه البرنامج كملف جهاز حرفي. بعض ملفات الجهاز عبارة عن ملفات جهاز كتلة. في الوضع الحالي، لن يتعامل البرنامج النصي الخاص بنا مع هذه الملفات.

./script2.sh /dev/sda

تشغيل scrip2.sh على ملف blockdevice

يمكننا الاستفادة من المنطقية OR عامل التشغيل ويتضمن اختبارًا آخر في عبارة if الثانية. هذه المرة، سواء كان الملف ملف جهاز حرفي أو ملف جهاز كتلة، فإن الاختبار سيرجع القيمة true. هذا هو “script3.sh”.

#!/bin/bash

if (( -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

script3.sh يتعامل بشكل صحيح مع ملفات الأجهزة الخاصة بالأحرف والكتل

إذا كان من المهم بالنسبة لك التمييز بين الأنواع المختلفة من ملفات الجهاز، فيمكنك استخدام ملفات متداخلة if هذه هي “script4.sh”.

#!/bin/bash

if (( -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

script8.sh يحدد بشكل صحيح ملفات الأجهزة الخاصة بالأحرف والكتل

باستخدام عامل AND المنطقي، يمكننا اختبار عدة خصائص في وقت واحد. هذا هو “script5.sh”. يتحقق من وجود ملف وأن البرنامج النصي لديه أذونات القراءة والكتابة له.

#!/bin/bash

if (( -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


script5.sh التحقق من وجود الملف وما إذا كانت أذونات القراءة والكتابة محددة

لاختبار وجود الدليل، استخدم -d هذا هو “script6.sh”. وهو جزء من البرنامج النصي الاحتياطي. أول شيء يفعله هو التحقق مما إذا كان الدليل الذي تم تمريره على سطر الأوامر موجودًا أم لا. ويستخدم الدليل المنطقي NOT المشغل ! في if اختبار العبارة.

#!/bin/bash

if (( ! -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

جعل البرنامج النصي قابلاً للتنفيذ باستخدام chmod

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

./script6.sh

جعل البرنامج النصي قابلاً للتنفيذ باستخدام chmod

يقوم البرنامج النصي بالعثور على الدليل والانتقال إلى إجراء النسخ الاحتياطي.


اختبار، لا تفترض

عاجلاً أم آجلاً، ستؤدي الافتراضات إلى حدوث أشياء سيئة. اختبر أولاً، ثم تصرف وفقًا لذلك.

المعرفة قوة. استخدم الاختبارات لتزويد نصوصك بالمعرفة التي تحتاجها.

ذات صلة: كيفية السماح لبرامج Linux النصية بالكشف عن تشغيلها في الآلات الافتراضية

أضف تعليق