مقدمة في البرمجة النصية لباش شل

نظرة عامة مفصلة على برمجة Bash Shell

تعد البرمجة النصية لـ Shell طريقة فعالة لأتمتة المهام التي تقوم بتنفيذها بانتظام على جهاز الكمبيوتر الخاص بك.

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

تحقق من بلديمقدمة لباشبريد.

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

لاحظ الفرق. نحن لا نقول Bash برمجة ولكن Bash scripting ، ولا نسمي Bash scripts "برامج Bash". هذا لأنه يمكنك عمومًا الوصول إلى قدر معين من التعقيد قبل الشعور بأن نصوصك تخرج عن نطاق السيطرة.

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

هناك العديد من الأشياء التي ستفوتها من لغات البرمجة مثل Perl أو JavaScript أو Python.

المتغيرات ليس لها نطاق ، كلها عالمية ، لا توجد مكتبة قياسية ، ليس لديك نظام وحدة نمطية ، على سبيل المثال. لكن المزايا رائعة جدًا: يمكنك بسهولة استدعاء أي أداة CLI تمامًا كما كنت في الصدفة ، ونهج Unix المتمثل في وجود العديد من الأوامر المساعدة الصغيرة يجعل بالفعل برمجة نصية شل تتألق. نفذ طلبات الشبكة باستخدامwget، معالجة النص باستخدامawk، و اكثر.

تعد البرمجة النصية لـ Shell واحدة من الأدوات التي تعرفها بشكل أفضل ، على الأقل تعرف كيفية قراءة البرنامج عندما تراه ، والأشياء الجيدة التي يمكن أن تجلبها في عملك اليومي.

يرشدك هذا البرنامج التعليمي إلى نظرية ومفاهيم برمجة Bash النصية. سأقوم بنشر المزيد من الدروس التفصيلية حول تقنيات محددة أو كيفية حل مشاكل معينة في المستقبل.

الأساسيات

يتم تخزين البرامج النصية في ملفات. يمكنك إعطاء أي اسم وامتداد لبرنامج نصي شل ، لا يهم. الشيء المهم هو أنه يجب أن يبدأ بـ "shebang" في السطر الأول:

#!/bin/bash

ويجب أن يكون ملفًا قابلاً للتنفيذ.

يتم تعيين الملف كملف قابل للتنفيذ باستخدامchmod، أمر الأداة المساعدة.

يمكنك استخدامه على النحو التالي:

chmod u+x myscript

لتصنعmyscriptملف قابل للتنفيذ للمستخدم الخاص بك (لن أذهب إلى ثقب أذونات الأرانب هنا ، لكنني سأغطيها قريبًا).

يمكنك الآن تنفيذ البرنامج النصي إذا كنت في نفس المجلد عن طريق استدعائه./myscript، أو باستخدام المسار الكامل لها.

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

تعليقات

التعليقات من أهم الأمور عند كتابة البرامج. سطر يبدأ بـ#الرمز هو تعليق (باستثناء خط shebang الذي رأيته أعلاه هنا).

#!/bin/bash
# this is a comment

يمكن أن يبدأ التعليق في نهاية السطر أيضًا:

#!/bin/bash
echo ok # this is a comment

المتغيرات

يمكنك تعيين المتغيرات باستخدام=المشغل أو العامل:

name=value

أمثلة:

ROOM_NUMBER=237
name=Flavio
nickname="Flavio"

يمكنك طباعة متغير باستخدام ملفechoالمدمج في الأمر والمسبقة$إلى اسم var:

echo $ROOM_NUMBER
echo $name

العاملين

تنفذ Bash بعض العمليات الحسابية التي يشيع استخدامها عبر لغات البرمجة:

  • +يضيف
  • -طرح او خصم
  • *تتضاعف
  • /يقسم
  • %modulo (باقي القسم)
  • **الأس

يمكنك مقارنة القيم باستخدام

  • <
  • <=
  • ==
  • >=
  • >

يمكنك أيضًا استخدام عوامل المقارنة هذه:

  • -ltأقل من
  • -gtأكثر من
  • -leأقل من أو يساوي
  • -geأكبر أو يساوي
  • -eqيساوي
  • -neلا يساوي

في هذا الطريق:

#!/bin/bash
age=23
minimum=18
if test $age -lt $minimum
then
  echo "Not old enough"
fi

العوامل المنطقية:

  • &&المنطقية AND
  • ||منطقي أو

تسمح هذه الاختصارات بإجراء عملية حسابية ثم مهمة:

  • +=
  • -=
  • *=
  • /=
  • %=

يوجد المزيد من المشغلين ، لكن هؤلاء هم الأكثر شيوعًا.

يمكنك طباعة أي شيء على الشاشة باستخدام ملفechoيأمر:

#!/bin/bash
echo "test"
echo test
echo testing something

الشروط المنطقية

AND: يقيّم إلى0(صفر) إذا كان كلاهماcommandوanothercommandالتنفيذ والعودة0. إرجاع الصفر في أوامر shell يعني أن الأمر كان ناجحاً. يتم تحديد رسالة الخطأ بواسطة قيمة إرجاع غير صفرية.

command && anothercommand

أو: يقيّم إلى0(صفر) إذا كان واحدًا على الأقل منcommandوanothercommandالتنفيذ والعودة0.

command || anothercommand

NOT: عكس قيمة الإرجاع المنطقية لـcommand:

! command

جمل التحكم

يمكنك استخدام العديد من هياكل التحكم التي قد تكون على دراية بها:

عبارات if / else

بسيطif:

if condition
then
  command
fi

ifمن ثمelse:

if condition
then
  command
else
  anothercommand
fi

متداخلةif- من ثم -else:

if condition
then
  command
elif
  anothercommand
else
  yetanothercommand
fi

يمكنك الاحتفاظ بملحقelseعلى نفس السطر باستخدام فاصلة منقوطة:

if condition ; then
  command
fi

مثال:

#!/bin/bash
DOGNAME=Roger
if [ "$DOGNAME" == "" ]; then
  echo "Not a valid dog name!"
else
  echo "Your dog name is $DOGNAME"
fi

لاحظ الأقواس؟ يجب أن نضيف أقواس عندما يتعين علينا إجراء أي نوع من التقييم للتعبير المنطقي.

الحلقات

حائط اللوب

بينماconditionيقرر القيمة الحقيقية ، تشغيلcommand

while condition
do
  command
done

حتى

حتىconditionيقرر القيمة الحقيقية ، تشغيلcommand

until condition
do
  command
done

في

كرر قائمة ونفذ أمرًا لكل عنصر

for item in list
do
  command
done

كسر واستمر

داخل الحلقات ، يمكنك استخدام ملفbreakوcontinueعبارات لكسر الحلقة تمامًا ، أو تخطي التكرار الحالي فقط.

قضية

يتيح لك هيكل التحكم في الحالة اختيار مسارات مختلفة بناءً على القيمة.

case value in
  a)
    command
    #...
    ;;
  b)
    command
    #...
    ;;
esac

مثل معfiوesacينهي هيكل الحالة وكما يمكنك أن تلاحظ ذلكcaseهجئت من الخلف.

نضيف فاصلة منقوطة مزدوجة بعد كل حالة.

أ*)القضية ستتعامل مع جميع الحالات التي لم يتم التعبير عنها صراحة. باستخدام أ|رمز يمكنك التعبير عن خيارات متعددة لحالة واحدة.

مثال:

#!/bin/bash
read -p "How many shoes do you have?" value
case $value in
  0|1)
    echo "Not enough shoes! You can't walk"
    ;;
  2)
    echo "Awesome! Go walk!"
    #...
    ;;
  *)
    echo "You got more shoes than you need"
    #...
    ;;
esac

يختار

أselectيُظهر الهيكل للمستخدم قائمة من الاختيارات للاختيار:

select item in list
do
  command
done

مثال:

#!/bin/bash
select breed in husky setter "border collie" chiwawa STOP
do
  if [ "$breed" == "" ]; then
    echo Please choose one;
  else
    break
  fi
done

echo “You chose $breed

شروط الاختبار

لقد استخدمت المصطلحconditionفي هياكل التحكم المذكورة أعلاه.

يمكنك استعمال الtestأمر Bash المدمج للتحقق من الشرط وإرجاع صحيح (0) أو قيمة خاطئة (لا0).

هنا مثال:

#!/bin/bash
if test "apples" == "apples"
then
  echo Apples are apples
fi

if ! test “apples” == “oranges” then echo Apples are not oranges fi

قراءة المدخلات من سطر الأوامر

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

أبسط استخدام هو:

echo "Age:"
read age

سيؤدي هذا إلى طباعة "العمر:" ويمكنك إدخال رقم ، ثم اضغط على إدخال وسيتم تخصيص هذا الرقم إلىageعامل.

ال-pخيارreadيوفر موجهًا داخليًا ، ويضع الإدخال في ملفageعامل:

read -p "Age: " age

الreadيحتوي الأمر على العديد من الخيارات ، والتي يمكنك فحصها عن طريق الكتابةhelp readفي باش.

إضافة الخيارات

يتم تحديد الخيارات باستخدام واصلة متبوعة بحرف ، مثل هذا:

ls -a
driveCar -b "Ford"

في التعليمات البرمجية الخاصة بك ، تستخدم الأمر المدمجgetoptsلتحليل الخيارات والحصول على القيمة.

إذا قبلنا الخياراتaوb، نحن نطعمgetopts abلحلقة من الوقت.

إذا كان الخيارbيقبل قيمة ، نلحق نقطتين:بعده ، لذلك نقوم بتنسيقgetoptsاستدعاء مثل هذا:getopts ab: arg

هذا مقتطف:

while getopts xy: arg
do
  case $arg in
    x) echo "Option $arg enabled" ;;
    y) echo "The value of $arg is $OPTARG" ;;
    esac
done

في هذا السيناريو ،$OPTARGيتم تعيين حرف الخيار تلقائيًا. نحن نرويgetoptsالخيارات التي نقبلها ، ونتعامل مع كل حالة على حدة.

يتم التعامل مع الأخطاء تلقائيًا بواسطةgetopts. يمكننا اختيار التعامل مع رسائل الخطأ بأنفسنا ، عن طريق إضافة نقطتين مسبقًا:قبل تعريف الحجج:getopts :xy: arg.

ثم نتعامل أيضًا مع ملف\?و:حالات. يتم استدعاء الأول عندما نمرر خيارًا غير صالح ، ويتم استدعاء الثاني عندما نفقد خيارًا:

while getopts :xy: arg
do
  case $arg in
    x) echo "Option $arg enabled" ;;
    y) echo "The value of $arg is $OPTARG" ;;
    :) echo "$0: Must supply an argument to -$OPTARG." >&2
       exit 1 ;;
    \?) echo "Invalid option -$OPTARG ignored." >&2 ;;
    esac
done

الآن إذا فاتتك إضافة وسيطة ، فإن رسائل الخطأ مختلفة.

العمل مع المعلمات

داخل البرنامج النصي ، يمكنك الوصول إلى أي معلمة تم تمريرها في وقت الاستدعاء. يمكنك الوصول إليهم باستخدام ملفات$0و$1و$2وهلم جرا ، حسب الموقف ، أين$0هو اسم الأمر وزيادة الرقم يتم زيادة موضع المعلمة. بعد الموضع 9 ، تحتاج إلى دعامات مجعدة:${10}و${11}...

على سبيل المثال تشغيل هذاstartCarالنصي:

#!/bin/bash
echo $0
echo $1

مثل./startCar fiestaسوف تطبع

./startCar
fiesta

الخاص$*بناء الجملة يطبع جميع المعلمات ، و$#عدد المعلمات التي تم تمريرها:

#!/bin/bash
echo $# $*
./test.sh Milan Florence Rome
3 Milan Florence Rome

فصل الخيارات عن المعلمات

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

driveCar -m "Ford Fiesta" - Milan Florence Rome

العمل مع السلاسل

إعطاء سلسلة:

dogname="Roger"

يمكنك الحصول على طوله باستخدام${#dogname}

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

يمكنك مقارنة سلسلتين باستخدام=أو==عامل التشغيل ، هو نفسه:

"$dogname" = "$anotherdogname"
"$dogname" == "$anotherdogname"

إنها ليست مهمة بسبب المساحات المحيطة بـ=.

يمكنك أيضًا التحقق من عدم المساواة:

"$dogname" != "$anotherdogname"

المصفوفات

المصفوفة عبارة عن قائمة بالعناصر معلنة داخل أقواس

breeds=(husky setter "border collie" chiwawa)

يمكنك الإشارة إلى أي عنصر داخل مصفوفة باستخدام الأقواس المربعة:

breeds[0]
breeds[1]

ويمكنك الحصول على العدد الإجمالي للعناصر باستخدام هذه الصيغة الخاصة:

${#breeds[@]}

أوامر مدمجة

لقد رأيت حتى الآن بعض الأوامر المضمنة بالفعل ، مثل هذه:

  • test
  • read
  • echo

لدى باش عدد منهم. يمكنك رؤيتهم جميعًا عن طريق الاتصالhelpوبعد ذلك يمكنك العثور على المساعدة لكل أمر باستخدام على سبيل المثالhelp read.

المهام

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

يدعوهم باشالمهام.

يمكنك تحديد وظيفة مع

function name {

}

مثال:

function cleanFolder {

}

وأنت تستدعيه مثل هذا:

cleanFolder

يمكنك تمرير المعلمات إلى المجلدات ، دون الحاجة إلى التصريح عنها - ما عليك سوى الرجوع إليها على أنها$1و$2إلخ ، مثلما تفعل مع معلمات البرنامج النصي:

function cleanFolder {
  echo "Clean folder $1"
}
cleanFolder "/Users/flavio/Desktop"

تحميل مجانيكتيب أوامر Linux


المزيد من دروس CLI: