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

نشرت: 2022-08-18
كمبيوتر محمول Linux يعرض موجه bash
fatmawati achmad zaenuri / Shutterstock.com

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

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

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

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

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

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

ذات صلة: كيفية استخدام Double Bracket Conditional Tests في Linux

مدى الاختبارات

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

  • -b : إرجاع القيمة true إذا كان الملف عبارة عن ملف خاص بالكتلة.
  • -c : إرجاع صحيح إذا كان الملف حرفًا خاصًا.
  • -d : إرجاع صحيح إذا كان "الملف" عبارة عن دليل.
  • -e : إرجاع صحيح إذا كان الملف موجودًا.
  • -f : إرجاع صحيح إذا كان الملف موجودًا وكان ملفًا عاديًا.
  • -g : يعود هذا الخيار صحيحًا إذا كان الملف يحتوي على مجموعة أذونات setgid ( chmod g+ ).
  • -h : إرجاع صحيح إذا كان الملف عبارة عن ارتباط رمزي.
  • -L : إرجاع صحيح إذا كان الملف رابطًا رمزيًا.
  • -k : يعود صحيحًا إذا كان لديه مجموعة البت اللاصق ( chmod +t ).
  • -p : إرجاع صحيح إذا كان الملف عبارة عن أنبوب مسمى.
  • -r : إرجاع صحيح إذا كان الملف قابلاً للقراءة.
  • -s : إرجاع صحيح إذا كانت الملفات موجودة وليست فارغة.
  • -S : إرجاع صحيح إذا كان الملف عبارة عن مأخذ توصيل.
  • -t : إرجاع صحيح إذا تم فتح واصف الملف في Terminal.
  • -u : يعود هذا الخيار صحيحًا إذا كان الملف يحتوي على مجموعة أذونات setuid ( chmod u+ ).
  • -w : إرجاع صحيح إذا كان الملف قابلاً للكتابة.
  • -x : إرجاع صحيح إذا كان الملف قابلاً للتنفيذ.
  • -O : يعود صحيحًا إذا كنت تملكه.
  • -G : يعود صحيحًا إذا كانت المجموعة مملوكة لمجموعتك.
  • -N : يعود هذا الخيار صحيحًا إذا تم تعديل الملف منذ آخر مرة تمت قراءته فيه.
  • ! : عامل التشغيل المنطقي NOT.
  • && : عامل التشغيل المنطقي AND.
  • || : عامل التشغيل المنطقي OR.

تبدأ القائمة بـ -b لأنه تم إهمال الاختبار -a واستبداله باختبار -e .

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

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

اختبار الملف العام if العبارة عبارة عن بناء نصي بسيط. تستخدم المقارنة داخل الأقواس المزدوجة ” [[ ]] ” الاختبار -f لتحديد ما إذا كان هناك ملف عادي بهذا الاسم.

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

 #! / بن / باش

إذا [[-f $ 1]] 

ومن بعد 

  صدى "الملف $ 1 موجود." 

آخر 

  صدى "لا يمكن العثور على الملف $ 1." 

فاي

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

 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 / عشوائي 

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

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

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

 #! / بن / باش

إذا [[-f $ 1]]
ومن بعد
  صدى "الملف $ 1 موجود."
آخر
  صدى "الملف $ 1 مفقود أو ليس ملفًا عاديًا."
فاي

إذا [[-c $ 1]]
ومن بعد
  صدى "الملف $ 1 هو ملف جهاز شخصية."
آخر
  صدى "الملف $ 1 مفقود أو ليس ملفًا خاصًا." 
فاي

إذا قمنا بتشغيل هذا البرنامج النصي على ملف الجهاز "/ dev / random" ، فإن الاختبار الأول يفشل وهو ما نتوقعه ، وينجح الاختبار الثاني. يتعرف على الملف كملف جهاز.

 ./script2.sh / ديف / عشوائي 

تشغيل script2.sh مقابل ملف جهاز شخصي

في الواقع ، يتعرف عليه كملف جهاز شخصي . بعض ملفات الجهاز عبارة عن ملفات جهاز حظر. كما هو الحال ، فإن نصنا لن يتعامل مع هؤلاء.

 ./script2.sh / dev / sda 

تشغيل scrip2.sh مقابل ملف جهاز حظر

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

 #! / بن / باش

إذا [[-f $ 1]]
ومن بعد
  صدى "الملف $ 1 موجود."
آخر
  صدى "الملف $ 1 مفقود أو ليس ملفًا عاديًا."
فاي

إذا [[-c $ 1 || -ب $ 1]]
ومن بعد
  صدى "الملف $ 1 عبارة عن حرف أو ملف جهاز حظر."
آخر
  صدى "الملف $ 1 مفقود أو ليس ملفًا خاصًا." 
فاي

يتعرف هذا البرنامج النصي على كل من ملفات الجهاز المحظور وجهاز الأحرف.

 ./script3.sh / ديف / عشوائي
 ./script3.sh / dev / sda 

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

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

 #! / بن / باش

إذا [[-f $ 1]]
ومن بعد
  صدى "الملف $ 1 موجود."
آخر
  صدى "الملف $ 1 مفقود أو ليس ملفًا عاديًا."
فاي

إذا [[-c $ 1]]
ومن بعد
  صدى "الملف $ 1 هو ملف جهاز شخصية."
آخر
  إذا [[-b $ 1]]
  ومن بعد
    صدى "الملف $ 1 هو ملف جهاز حظر." 
  آخر
    صدى "الملف $ 1 مفقود أو ليس ملف جهاز."
  فاي
فاي

يتعرف هذا البرنامج النصي على ملفات الجهاز الممنوع وجهاز الحظر ويصنفها.

 ./script4.sh / ديف / عشوائي
 ./script4.sh / dev / sda 

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

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

 #! / بن / باش

إذا [[-f $ 1 && -r $ 1 && -w $ 1]]
ومن بعد
  صدى "الملف $ 1 موجود ولدينا أذونات القراءة / الكتابة."
آخر
  صدى "الملف $ 1 مفقود ، وليس ملفًا عاديًا ، أو لا يمكننا القراءة / الكتابة إليه."
فاي

سنقوم بتشغيل البرنامج النصي على ملف خاص بنا ، وآخر ينتمي إلى root .

 ./script5.sh .bashrc
 ./script5.sh / etc / fstab 

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

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

 #! / بن / باش

إذا [[ ! -d $ 1]]
ومن بعد
  صدى "إنشاء دليل النسخ الاحتياطي:" $ 1
  مكدير 1 دولار

  إذا [[ ! $؟ -Eq 0]]
  ومن بعد
    صدى "تعذر إنشاء دليل النسخ الاحتياطي:" $ 1
    خروج
  فاي
آخر
  صدى "دليل النسخ الاحتياطي موجود."
فاي

# تواصل مع ملف النسخ الاحتياطي
صدى "النسخ الاحتياطي إلى:" $ 1

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

سنقوم بتشغيل البرنامج النصي ثم نتحقق من الخيار ls و -d (الدليل) لمعرفة ما إذا كان دليل النسخ الاحتياطي موجودًا أم لا.

 ./script6.sh المستندات / نسخة احتياطية للمشروع
 ls -d المستندات / مشروع النسخ الاحتياطي 

يقوم script6.sh بالكشف عن وجود دليل

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

 ./script6.sh 

يقوم script6.sh بإعادة استخدام دليل موجود

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

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

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

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

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