9 أمثلة على Bash Script لتبدأ في نظام Linux
نشرت: 2022-07-05إذا كنت تبدأ باستخدام Bash scripting على نظام Linux ، فإن فهمك الأساسي للأساسيات سوف يجعلك في وضع جيد. إنها أساس معرفة أعمق ومهارات برمجة أعلى.
تذكر ، اجعل نصوصك قابلة للتنفيذ
لكي تقوم الصدفة بتنفيذ برنامج نصي ، يجب أن يحتوي البرنامج النصي على مجموعة أذونات الملف القابل للتنفيذ. بدون ذلك ، يكون البرنامج النصي الخاص بك مجرد ملف نصي. مع ذلك ، لا يزال ملفًا نصيًا ، لكن الصدفة تعرف أنه يحتوي على إرشادات وستحاول تنفيذها عند بدء تشغيل البرنامج النصي.
الهدف الكامل من كتابة البرامج النصية هو أنها تعمل ، لذا فإن الخطوة الأساسية الأولى هي معرفة كيفية السماح لنظام Linux بمعرفة أن البرنامج النصي الخاص بك يجب اعتباره قابلاً للتنفيذ.
يتيح لنا الأمر chmod
تعيين أذونات الملف. يمكن تعيين إذن التنفيذ بعلامة + x.
chmod + x script1.sh
ستحتاج إلى القيام بذلك مع كل نص من نصوصك. استبدل “script1.sh” باسم البرنامج النصي الخاص بك.
1. ما هذا السطر الأول الغريب؟
يخبر السطر الأول من البرنامج النصي الصدفة بالمترجم الذي يجب استدعاؤه لتشغيل هذا البرنامج النصي. يجب أن يبدأ السطر الأول بـ shebang ، "#!" ، والمعروف أيضًا باسم hashbang. ال "#!" يخبر الغلاف أن هذا السطر يحتوي على مسار واسم المترجم الذي تمت كتابة النص من أجله.
هذا مهم لأنك إذا كتبت نصًا ليتم تشغيله في Bash ، فأنت لا تريد أن يتم تفسيره بواسطة غلاف مختلف. من المحتمل أن يكون هناك عدم توافق. تتمتع Bash - مثل معظم القذائف - بمراوغاتها الخاصة في بناء الجملة والوظائف التي لن تمتلكها الصدفيات الأخرى ، أو ستنفذها بشكل مختلف.
عند تشغيل برنامج نصي ، تفتح الصدفة الحالية البرنامج النصي وتحدد القشرة أو المترجم الذي يجب استخدامه لتنفيذ هذا البرنامج النصي. ثم يطلق تلك القشرة ويمرر البرنامج النصي إليها.
#! / بن / باش صدى يعمل في $ SHELL
يمكن قراءة السطر الأول من هذا البرنامج النصي على أنه "استخدم المترجم الموجود في / bin / bash لتشغيل هذا البرنامج النصي."
يكتب السطر الوحيد في البرنامج النصي القيمة المحفوظة في المتغير البيئي $SHELL
إلى شاشة المحطة الطرفية. هذا يؤكد أن Bash تم استخدامه لتنفيذ البرنامج النصي.
./script1.sh
كخدعة صغيرة ، يمكننا إثبات أن النص يتم تمريره إلى أي مترجم نختاره.
#! / بن / قطة يتم تمرير جميع أسطر النص إلى الأمر cat ويتم طباعتها في نافذة المحطة. يتضمن خط شيبانج.
script2.sh
يتم تشغيل هذا البرنامج النصي بواسطة الغلاف الحالي وتمريره إلى الأمر cat
. يقوم الأمر cat
"بتشغيل" البرنامج النصي.
كتابة رواياتك بهذا الشكل تفترض أنك تعرف مكان وجود الصدفة أو أي مترجم آخر على الجهاز المستهدف. و 99٪ من الوقت ، لا بأس بذلك. لكن بعض الناس يحبون التحوط من رهاناتهم وكتابة نصوصهم على النحو التالي:
#! / usr / bin / env bash صدى يعمل في $ SHELL
script3.sh
عندما يتم تشغيل البرنامج النصي ، يبحث shell عن موقع الصدفة المسماة. إذا كانت الصدفة في موقع غير قياسي ، فإن هذا النوع من النهج يمكن أن يتجنب أخطاء "المترجم السيئ".
لا تسمعوا ، إنه يكذب!
في Linux ، هناك دائمًا أكثر من طريقة لسلخ قطة أو إثبات خطأ المؤلف. لكي تكون واقعيًا تمامًا ، هناك طريقة لتشغيل البرامج النصية بدون shebang ، ودون جعلها قابلة للتنفيذ.
إذا قمت بتشغيل shell الذي تريده لتنفيذ البرنامج النصي وتمرير النص البرمجي كمعامل سطر أوامر ، فسيقوم shell بتشغيل البرنامج النصي وتشغيله - سواء كان قابلاً للتنفيذ أم لا. نظرًا لأنك اخترت shell في سطر الأوامر ، فلا داعي لـ shebang.
هذا هو النص بأكمله:
صدى "لقد تم إعدامي بواسطة" $ SHELL
سنستخدم ls
لنرى أن النص غير قابل للتنفيذ حقًا ونطلق Bash باسم البرنامج النصي:
ls
bash script4.sh
هناك أيضًا طريقة لتشغيل البرنامج النصي بواسطة الصدفة الحالية ، وليس قذيفة تم إطلاقها خصيصًا لتنفيذ البرنامج النصي. إذا كنت تستخدم الأمر source
، والذي يمكن اختصاره إلى نقطة واحدة " .
"، يتم تنفيذ البرنامج النصي الخاص بك بواسطة shell الحالي الخاص بك.
لذلك ، لتشغيل برنامج نصي بدون shebang ، بدون إذن الملف القابل للتنفيذ ، ودون تشغيل قذيفة أخرى ، يمكنك استخدام أي من هذين الأمرين:
المصدر script4.sh
. script4.sh
على الرغم من أن هذا ممكن ، إلا أنه لا يوصى به كحل عام. هناك عيوب.
إذا كان البرنامج النصي لا يحتوي على كلمة shebang ، فلا يمكنك تحديد الغلاف الذي تم كتابته من أجله. هل ستتذكر في غضون عام؟ وبدون تعيين الإذن القابل للتنفيذ على البرنامج النصي ، لن يقوم الأمر ls
كملف قابل للتنفيذ ، ولن يستخدم اللون لتمييز النص عن الملفات النصية العادية.
ذات صلة: سطور الأوامر: لماذا لا يزال الناس يضايقونهم؟
2. طباعة النص
تعد كتابة النص إلى الجهاز مطلبًا شائعًا. القليل من الملاحظات المرئية تقطع شوطًا طويلاً.
بالنسبة للرسائل البسيطة ، يكفي أمر echo
. يسمح ببعض التنسيق للنص ويتيح لك العمل مع المتغيرات أيضًا.
#! / بن / باش صدى هذه سلسلة بسيطة. صدى "هذه سلسلة تحتوي على" علامات اقتباس مفردة "لذا فهي ملفوفة بين علامتي اقتباس". صدى "هذا يطبع اسم المستخدم:" $ USER echo -e "يتيح لنا الخيار -e استخدام \ n توجيهات التنسيق \ n لتقسيم السلسلة."
./script5.sh
يمنحنا الأمر printf
مزيدًا من المرونة وقدرات تنسيق أفضل بما في ذلك تحويل الأرقام.
يقوم هذا البرنامج النصي بطباعة نفس الرقم باستخدام ثلاث قواعد عددية مختلفة. النسخة السداسية العشرية منسقة أيضًا للطباعة بأحرف كبيرة ، بأصفار بادئة وعرض من ثلاثة أرقام.
#! / بن / باش printf "عشري:٪ d ، ثماني:٪ o ، سداسي عشري:٪ 03X \ n" 32 32 32
./script6.sh
لاحظ أنه على عكس echo
، يجب أن تخبر printf
أن تبدأ سطرًا جديدًا برمز " \n
".
3. إنشاء واستخدام المتغيرات
تتيح لك المتغيرات تخزين القيم داخل برنامجك ومعالجتها واستخدامها. يمكنك إنشاء المتغيرات الخاصة بك أو استخدام متغيرات البيئة لقيم النظام.
#! / بن / باش mill Millennium_text = "السنوات منذ الألفية:" Current_time = $ (تاريخ '+٪ H:٪ M:٪ S') todays_date = $ (التاريخ '+٪ F') السنة = $ (التاريخ '+٪ Y') صدى "الوقت الحالي:" $ current_time صدى "تاريخ اليوم:" $ todays_date years_since_Y2K = $ ((عام - 2000)) صدى $ Millennium_text $ years_since_Y2K
يقوم هذا البرنامج النصي بإنشاء متغير سلسلة يسمى millennium_text
. يحتوي على سطر من النص.
ثم يقوم بإنشاء ثلاثة متغيرات عددية.
- تتم تهيئة متغير
current_time
إلى وقت تنفيذ البرنامج النصي. - يتم تعيين المتغير
todays_date
على التاريخ الذي يتم فيه تشغيل البرنامج النصي. - متغير
year
يحمل العام الحالي.
للوصول إلى القيمة المخزنة في متغير ، اسبق اسمه بعلامة الدولار "$".
./script7.sh
يقوم البرنامج النصي بطباعة الوقت والتاريخ ، ثم يحسب عدد السنوات التي مرت منذ الألفية ، ويخزن ذلك في المتغير years_since_Y2K
.
أخيرًا ، يقوم بطباعة السلسلة الموجودة في متغير years_since_Y2K
millennium_text
ذات صلة: كيفية العمل مع المتغيرات في Bash
4. معالجة مدخلات المستخدم
للسماح للمستخدم بإدخال قيمة سيستخدمها البرنامج النصي ، يجب أن تكون قادرًا على التقاط مدخلات لوحة مفاتيح المستخدم. يسمح أمر read
Bash لـ ut بالقيام بذلك. هذا مثال بسيط.
#! / بن / باش صدى "أدخل رقمًا واضغط على \" أدخل \ "" قراءة user_number1 ؛ صدى "أدخل رقمًا آخر واضغط على \" أدخل \ "" قراءة user_number2 ؛ printf "لقد أدخلت:٪ d و٪ d \ n" $ user_number1 $ user_number2 printf "يضافان معًا:٪ d \ n" $ ((user_number1 + user_number2))
يطالب البرنامج النصي برقمين. تتم قراءتها من لوحة المفاتيح وتخزينها في متغيرين ، user_number1
و user_number2
.
يقوم البرنامج النصي بطباعة الأرقام على نافذة المحطة ، ويجمعها معًا ، ويطبع الإجمالي.
./script8.sh
يمكننا دمج المطالبات في أوامر read
باستخدام الخيار -p
(موجه).
#! / بن / باش read -p "أدخل رقمًا واضغط على \" Enter \ "" user_number1 ؛ read -p "أدخل رقمًا آخر واضغط على \" Enter \ "" user_number2 ؛ printf "لقد أدخلت:٪ d و٪ d \ n" $ user_number1 $ user_number2 printf "يضافان معًا:٪ d \ n" $ ((user_number1 + user_number2))
هذا يجعل الأشياء أكثر إتقانًا وأسهل في القراءة. كما يسهل تصحيح البرامج النصية التي يسهل قراءتها.
./script9.sh
البرنامج النصي يتصرف بشكل مختلف قليلاً الآن. يكون إدخال المستخدم على نفس سطر الموجه.
لالتقاط إدخال لوحة المفاتيح دون ترديده في النافذة الطرفية ، استخدم الخيار -s
(صامت).
#! / بن / باش read -s -p "أدخل رقم التعريف الشخصي السري واضغط على \" Enter \ "" secret_PIN ؛ printf "\ nShhh ... إنه٪ d \ n" $ secret_PIN
./script10.sh
يتم التقاط قيمة الإدخال وتخزينها في متغير يسمى secret_PIN
، ولكن لا يتم ترديدها على الشاشة عندما يكتبها المستخدم . ما تفعله به بعد ذلك يعود إليك.
5. قبول المعلمات
في بعض الأحيان يكون من الأنسب قبول إدخال المستخدم كمعلمات لسطر الأوامر بدلاً من وجود نص برمجي ينتظر الإدخال. إن تمرير القيم إلى نص برمجي أمر سهل. يمكن الرجوع إليها داخل البرنامج النصي كما لو كانت أي متغير آخر.
يصبح المتغير الأول متغيرًا $1
، ويصبح المعامل الثاني متغيرًا $2
، وهكذا. المتغير $0
يحمل دائمًا اسم البرنامج النصي ، والمتغير $#
يحمل عدد المعلمات التي تم توفيرها في سطر الأوامر. المتغير $@
عبارة عن سلسلة تحتوي على كافة معلمات سطر الأوامر.
#! / بن / باش printf "هذا البرنامج النصي يسمى:٪ s \ n" $ 0 printf "لقد استخدمت٪ d معلمات سطر أوامر \ n" $ # # حلقة من خلال المتغيرات لبارام في "$ @" ؛ فعل صدى "$ param" فعله صدى "المعلمة 2 كانت:" $ 2
يستخدم هذا البرنامج النصي $0
و $#
لطباعة بعض المعلومات. ثم يستخدم ?@
لإجراء حلقة عبر كافة معلمات سطر الأوامر. يستخدم $2
لإظهار كيفية الوصول إلى قيمة معلمة واحدة معينة.
./script11.sh
إن التفاف عدة كلمات بين علامات الاقتباس "" يجمعهم في معامل واحد.
6. قراءة البيانات من الملفات
تعد معرفة كيفية قراءة البيانات من ملف مهارة رائعة يجب امتلاكها. يمكننا القيام بذلك في Bash باستخدام حلقة while.
#! / بن / باش LineCount = 0 بينما IFS = '' read -r LinefromFile || [[-n "$ {LinefromFile}"]]؛ فعل ((LineCount ++)) صدى "Reading line $ LineCount: $ {LinefromFile}" تم <"$ 1"
نحن نقوم بتمرير اسم الملف الذي نريد أن يقوم البرنامج النصي بمعالجته كمعامل سطر أوامر. ستكون المعلمة الوحيدة ، لذلك داخل البرنامج النصي $1
سيحمل اسم الملف. نحن نعيد توجيه هذا الملف إلى حلقة while
.
تقوم حلقة while
بتعيين فاصل الحقل الداخلي إلى سلسلة فارغة ، باستخدام تعيين IFS=''
. هذا يمنع أمر read
من تقسيم الأسطر على مسافة بيضاء. يعتبر حرف الإرجاع فقط في نهاية السطر هو النهاية الحقيقية للسطر.
يلبي بند [[ -n "${LinefromFile}" ]]
إمكانية ألا ينتهي السطر الأخير في الملف بسطر إرجاع. حتى إذا لم يحدث ذلك ، فسيتم التعامل مع هذا السطر الأخير بشكل صحيح ومعاملته على أنه سطر عادي متوافق مع POSIX.
./script12.sh twinkle.txt
7. استخدام الاختبارات الشرطية
إذا كنت تريد أن يقوم البرنامج النصي الخاص بك بتنفيذ إجراءات مختلفة لشروط مختلفة ، فأنت بحاجة إلى إجراء اختبارات شرطية. يوفر بناء جملة اختبار القوسين - في البداية - عددًا هائلاً من الخيارات.
#! / بن / باش السعر = 1 دولار إذا [[price -ge 15]] ؛ ومن بعد صدى "مكلفة للغاية". آخر صدى "شرائه!" فاي
يوفر Bash مجموعة كاملة من عوامل المقارنة التي تتيح لك تحديد أشياء مثل ما إذا كان الملف موجودًا ، وما إذا كان بإمكانك القراءة منه ، وما إذا كان يمكنك الكتابة إليه ، وما إذا كان هناك دليل موجود.
يحتوي أيضًا على اختبارات عددية لـ يساوي -qe
، وأكبر من -gt
، وأقل من أو يساوي -le
، وما إلى ذلك ، على الرغم من أنه يمكنك أيضًا استخدام ==
، >=
، <=
التدوين المألوف.
./script13.sh 13
./script13.sh 14
./script13.sh 15
./script13.sh 16
8. قوة الحلقات
من الأفضل القيام بتكرار الإجراءات مرارًا وتكرارًا باستخدام الحلقات. تتيح لك حلقة for
تشغيل حلقة عدة مرات. قد يصل هذا إلى رقم معين ، أو قد يستمر حتى تشق الحلقة طريقها عبر قائمة العناصر.
#! / بن / باش لـ ((i = 0 ؛ i <= $ 1 ؛ i ++)) فعل صدى "C-style for loop:" $ i فعله لأني في {1..4} فعل صدى "For loop with a range:" $ i فعله لأني في "صفر" "واحد" "اثنان" "ثلاثة" فعل صدى "حلقة For بقائمة من الكلمات:" $ i فعله website = "How To Geek" لأني في $ الموقع فعل صدى "For loop مع مجموعة من الكلمات:" $ i فعله
كل هذه الحلقات هي حلقات for
، لكنها تعمل مع أنواع مختلفة من عبارات الحلقة والبيانات.
./script14.sh 3
الحلقة الأولى هي حلقة for
كلاسيكية على النمط C. تتم تهيئة عداد الحلقة i
إلى الصفر ، ويزيد مع كل دورة من الحلقة. بينما قيمة i
أقل من أو تساوي القيمة المحتفظ بها في $1
، ستستمر الحلقة في العمل.
الحلقة الثانية تعمل من خلال مجموعة من الأرقام من 1 إلى 4. الحلقة الثالثة تعمل من خلال قائمة الكلمات. بينما هناك المزيد من الكلمات التي يجب معالجتها ، تستمر الحلقة في التكرار.
تعمل الحلقة الأخيرة من خلال قائمة الكلمات في متغير سلسلة.
9. وظائف
تسمح لك الوظائف بتغليف أجزاء من التعليمات البرمجية في إجراءات مسماة يمكن استدعاؤها من أي مكان داخل البرنامج النصي الخاص بك.
لنفترض أننا أردنا أن يقوم البرنامج النصي الذي يقرأ سطورًا من ملف بإجراء نوع من المعالجة على كل سطر. سيكون من الملائم وجود هذا الرمز داخل وظيفة.
#! / بن / باش LineCount = 0 وظيفة count_words () { printf "٪ d كلمة في السطر٪ d \ n" $ (صدى $ 1 | wc -w) $ 2 } بينما IFS = '' read -r LinefromFile || [[-n "$ {LinefromFile}"]]؛ فعل ((LineCount ++)) count_words "$ LinefromFile" $ LineCount تم <"$ 1" count_words "هذا ليس في الحلقة" 99
لقد قمنا بتعديل برنامج قراءة الملفات الخاص بنا عن طريق إضافة دالة تسمى count_words
. يتم تعريفه قبل أن نحتاج إلى استخدامه.
يبدأ تعريف الوظيفة function
الكلمة. ويتبع ذلك اسم فريد لوظيفتنا متبوعًا بأقواس " ()
". يوجد جسم الوظيفة داخل أقواس معقوفة "{}".
لا يتسبب تعريف الوظيفة في تنفيذ أي كود. لا يتم تشغيل أي شيء في الوظيفة حتى يتم استدعاء الوظيفة.
تقوم وظيفة count_words
بطباعة عدد الكلمات في سطر نصي ورقم السطر. يتم تمرير هاتين المعلمتين إلى الوظيفة تمامًا مثل تمرير المعلمات في البرنامج النصي. يصبح المعامل الأول متغير دالة $1
، ويصبح المعامل الثاني متغير دالة $2
، وهكذا.
تقرأ حلقة while
كل سطر من الملف وتمرره إلى دالة count_words
مع رقم السطر. ولإظهار أنه يمكننا استدعاء الوظيفة من أماكن مختلفة داخل البرنامج النصي ، نسميها مرة أخرى خارج حلقة while
.
./script15.sh twinkle.txt
لا تخف من منحنى التعلم
البرمجة النصية مجزية ومفيدة ، لكن من الصعب الدخول فيها. بمجرد حصولك على بعض الأساليب التي يمكن إعادة استخدامها تحت حزامك ، ستتمكن من كتابة نصوص جديرة بالاهتمام بسهولة نسبيًا. ثم يمكنك النظر في وظائف أكثر تقدمًا.
امشِ قبل أن تتمكن من الجري ، وخذ وقتًا للاستمتاع بالرحلة.
ذات صلة: 10 أوامر Linux أساسية للمبتدئين