وجدت نفسك ترغب في تعلم المزيد حول كتابة البرامج النصية في نظام تشغيل لينكس، ولكنك لم تكن متأكدًا من أين تبدأ؟ هل أنت جديد نسبيًا في عالم أنظمة التشغيل المبنية على يونكس وترغب في توسيع مهاراتك لإنجاز بعض البرمجة النصية الأساسية؟ ستغطي هذه الدورة التعليمية للمبتدئين أساسيات كتابة البرامج النصية في نظام تشغيل لينكس باستخدام باش، بما في ذلك إنشاء البرنامج النصي وتشغيله، وكذلك العمل مع السلاسل والحلقات.
يُستخدم برمجة الشيل لتأتيم المهام الإدارية الشائعة
بغض النظر عن نظام التشغيل، تُستخدم البرامج النصية للشيل لتأتيم المهام الإدارية المتكررة. على سبيل المثال، في نظام ويندوز يمكنك إعادة تسمية الملفات باستخدام مستكشف الملفات. ولكن إذا كنت بحاجة إلى إعادة تسمية العديد من الملفات، فسيكون من المهمل استخدام الواجهة الرسومية. تتيح لك باورشيل تأتيم المهمة وتكرارها بشكل موثوق.
في أنظمة التشغيل المبنية على لينكس، يتم استخدام باش وغيرها من الأوامر لتأتيم المهام مثل العمل مع الملفات، وتعديل تكوين النظام، والعديد من المهام الأخرى التي يمكن أداؤها بأمر واحد.
ما تحتاج إليه لتعلم برمجة الشيل باستخدام باش
لكتابة وتشغيل برنامج شيل باش، تحتاج فقط إلى ثلاثة أشياء:
- أي محرر نص عادي، مثل Notepad، Text Editor، TextEdit، vi، emacs، أو Visual Studio Code.
- A terminal emulator, an application that comes preinstalled with most operating systems and is often called Terminal, Console, or Command Prompt.
- Bash نفسه.
وسيط المحطة النهائية هو المكان الذي ستكتب فيه الأوامر وتعمل عليها بالضغط على Enter أو Return. فيما يتعلق بـ Bash، ستعتمد إمكانية وجوده مسبقًا على المنصة التي تستخدمها:
- على macOS، يأتي Bash مثبتًا مسبقًا. في الإصدارات الأحدث، يكون Z shell (zsh) هو الطابعة الافتراضية، وهذا جيد. طالما كان Bash مثبتًا، يمكنك تشغيل سيناريوهات Bash من zsh أيضًا.
- نظام التشغيل Linux يتم تثبيت Bash بشكل عام. (يمكنك التحقق من ذلك عن طريق البحث عما إذا كانت نظامك يشمل ملف /bin/bash.) Android هو حالة خاصة لا تأتي مع Bash. هناك خطوات للحصول على Bash على Android، والتي لن تتطرق إليها هذه المقالة.
- ويندوز لا يأتي مع برنامج باش. باورشيل هو واجهة سطر الأوامر الافتراضية في ويندوز. ستحتاج إلى تثبيت توزيع لينكس تحت نظام ويندوز النظام الفرعي للينكس (WSL) لتشغيل باش.
للعثور على إصدار باش الخاص بك، قم بتشغيل الأمر باش –version. بينما حتى الإصدارات القديمة من باش تمنحك الكثير من القوة، يقدم كل من باش 3 و 4 تسهيلات جيدة لأوامر معينة. إذا كان أمر معين يتطلب واحدًا من هذه الإصدارات من باش، سيتم ذكره أدناه.
ما هو الشل؟
في عالم الحوسبة، الـ شل هو برنامج يعمل كواجهة لنظام التشغيل الأساسي. يمكن أن يكون الشل واجهة مستخدم رسومية (GUI)، مثل واجهة ويندوز.
لغات برمجة الشل
ومع ذلك، يستخدم الناس عمومًا المصطلح للإشارة على وجه التحديد إلى واجهة سطر الأوامر (CLI) – واجهة تتألف من أسطر نصية تتفاعل معها باستخدام لوحة المفاتيح فقط. وفيما يلي بعض أمثلة على لغات برمجة القواقع لأنظمة التشغيل يونكس:
- القوقع باش (اختصارًا لـ “بورن أجين شيل”)
- قوقع سي سي
- قوقع كورن
هنا، سنركز على قوقع باش. إنها واجهة قيدية يونكس مجانية شهيرة مثبتة مسبقًا على معظم توزيعات لينكس وعلى نظام macOS.
ما هو سكربت القوقع؟
للقواقع لغتها البرمجية الخاصة. تستخدم هذه اللغة لإرسال الأوامر إلى القوقع، التي تقوم بتنفيذها بعد ذلك. يمكنك كتابة هذه الأوامر مباشرة في القوقع، أو يمكنك حفظها في ملف – سكربت – ومن ثم تنفيذ ذلك الملف من القوقع. يتم الكتابة بنفس الصيغة في كلا الحالتين.
سيتناول هذا المقال أساسيات كتابة سكربتات القوقع لإنشاء هذا الملف.
الأساسيات في كتابة سكربتات القوقع
لنبدأ ببعض الأساسيات في كتابة سكربتات القوقع. من أجل كتابة سكربت بسيط، سنتعلم بعض الأوامر البسيطة في كتابة سكربتات القوقع في لينكس:
- أنشئ ملف نصي فارغ جديد في محرر نصوص.
- اكتب
#!/bin/bash
كأول سطر. - اكتب الأوامر الخاصة بك أدناه.
- احفظ الملف، تفضل بإضافة امتداد “.sh” أو بدون امتداد على الإطلاق.
السطر #!/bin/bash
يُسمى “شيبانغ”. يُخبر الجهاز الناظر بأن النص البرمجي يجب تنفيذه في باش ويجب أن يكون السطر الأول في النص. إذا قمت بالتبديل إلى جهاز ناظر آخر، سيتم تشغيل النص البرمجي في باش.
لتجربة هذه العملية بنفسك، أنشئ ملفًا بالاسم ‘hello_world’ في دليل المنزل الخاص
#!/bin/bash echo "hello world"
هذا كل شيء – لقد أنشأت نص برمجي في باش!

قبل أن تتمكن من تشغيله، ستحتاج على الأرجح إلى تغيير أذونات الملف.
تعيين الأذونات لتشغيل الأوامر النصية باستخدام chmod
لتغيير الأذونات على ملف “hello_world” الخاص بنا، يجب عليك تشغيل هذا الأمر المحدد في محاكي الطرفية الخاص بك. هذا يمنح المستخدم الذي يمتلك الملف الإذن بتنفيذ الملف.
chmod u+x 'hello_world'

إذا كنت ترغب فقط في تشغيل النص الخاص بالشل، يمكنك تخطي القسم التالي. بالنسبة لأولئك الذين يشعرون بالفضول حول أمر chmod
، فإن chmod
تعني “تغيير الوضع”، وتستخدم لتغيير “أوضاع” الملفات (أو الأذونات) في نظام Unix. في أنظمة تشغيل تشبه Unix، يمكنك تعيين أذونات الملفات لثلاث فئات من المستخدمين:
- المستخدم الذي يمتلك الملف (يمثله
u
في chmod). - المجموعة التي تمتلك الملف (
g
). - الآخرين (
o
).
مع أمر chmod
، يمكنك أيضًا استخدام a
للإشارة إلى كل هؤلاء.
كل ملف لديه 3 أنواع من الأذونات (أو “أوضاع”):
- القراءة (
r
) - الكتابة (
w
) - التنفيذ (
x
)
ويمكنك أيضًا إضافة (+
) أو إزالة (-
) الأذونات.
المعلمة الأولى في chmod هي مزيج من هذه الثلاثة – المستخدم أولاً، الإجراء ثانيًا، والوضع ثالثًا. إليك بعض أمثلة على الأوامر:
chmod gu+rw 'hello_world'
سيقوم بإضافة أذونات القراءة والكتابة للمالك والمجموعة المالكة.chmod a-x 'hello_world'
سيقوم بإزالة أذونات التنفيذ للجميع.chmod u+rwx 'hello_world' 'hello_world_2'
سيمنح المالك إذن القراءة والكتابة والتنفيذ لملفات “hello_world” و “hello_world_2”.
لقد تناولنا فقط الأساسيات جدًا لأمر chmod
هنا. هناك أيضًا طريقة أكثر تعقيدًا، ولكن أقل إيضاحًا لتحديد هذه الأوضاع (الـ “numeric notation”)، وكذلك أمر مختلف يمكنك استخدامه لرؤية الأذونات التي تمتلكها ملفاتك (ls -l
). لن نتناول هذه المواضيع هنا.
تنفيذ نص برمجي
حان الوقت لتنفيذ أول نص برمجي لدينا. بشكل عام، لتشغيل نص برمجي، قم بكتابة مساره في محاكي الطرفية واضغط على enter.
./hello_world
يمكنك استخدام المسار النسبي أو المطلق. عند استخدام المسار النسبي، استخدم دائمًا ./
في بداية الأمر الخاص بك: يُخبر هذا المحاكي بالبحث في المجلد الحالي (الممثل بـ '.'
)، بدلاً من البحث في الدلائل المعرفة في متغير البيئة PATH
.

استخدام التعليقات لتوثيق نص برمجيك
كل ما بعد #
في سطر واحد في نص برمجي Bash يُعتبر تعليقًا. يمكن أن تكون هذه مفيدة للتواصل بشأن ما يفعله سطر معقد أو لإعطاء نظرة عامة على ما تفعله أجزاء كبيرة من النص البرمجي الخاص بك.
على سبيل المثال:
#!/bin/bash # # This shell script prints "hello world". # echo "hello world" # This line prints "hello world".
مقدمة إلى المتغيرات
عند كتابة السكربتات، قد تكون مناسبة لتحديد المتغيرات. في باش، يمكنك فعل ذلك عن طريق كتابة اسم المتغير وقيمته، مفصولين بعلامة يساوي: VARIABLENAME='VALUE'
.
يجب عدم وضع مسافات بجانب علامة اليساوي — فقد يعتقد باش أنك تريد تشغيل عملية بدلا من ذلك.
استخدم علامات الاقتباس الفردي لتحييط القيمة لمنع باش من تفسيرها كشيء آخر. في باش، لا تحتوي المتغيرات على أنواع — كل شيء يعتبر أساساً سلسلة نصية. يتوقف على برامج باش تحليل السلسلة كنوع مختلف، مثل رقم.
لاشارة إلى قيمة المتغير، استخدم اسم المتغير بإضافة علامة الدولار: $VARIABLENAME
.
لتجربة هذا عملياً، يمكنك تغيير سكربتك إلى هذا:
#!/bin/bash HELLO="hello variable world" echo $HELLO # should print "hello variable world"
استقبال الوسيطات
الكلمات الفردية التي تكتب عند كتابة أمر تُدعى وسيطات. في مثالنا “chmod u+x 'hello_world'
“، chmod
، u+x
، و'hello_world'
هي ثلاث وسيطات مختلفة. “chmod
” هو اسم الأمر بينما “u+x
” و “hello_world
” تسمى معلمات — وسيطات توفر معلومات إضافية للأمر.
في سكربتك، يمكنك الوصول إلى هذه الوسيطات من خلال المتغيرات. لتجنب التضارب مع المتغيرات المحلية، تسمى هذه المتغيرات باستخدام الأرقام — “$0
” يشير إلى اسم الأمر، “$1
” هو الوسيط القادم، “$2
” هو الأتي بعده، وهكذا.
لنجرب هذا:
#!/bin/bash HELLO="hello $1 world" echo $HELLO
الآن، قم بتشغيل هذا النص بتلك المعاملات:
./hello_world bash script
يجب أن يكون الناتج hello bash world
، مع استخدام المعامل الأول وتجاهل الثاني.
إذا كنت ترغب في رؤية bash script
كمعامل واحد، فعليك أن تضعه بين اقتباسات:
./hello_world 'bash script'

استخدام التعليمات الشرطية لتشغيل الكود شرطيًا
أحد الأشياء الأساسية التي يريد المبرمجون القيام بها داخل نص برمجي هو تشغيل قطعة من الكود فقط إذا تم تلبية شرط معين. تمتلك باش تعليمة if
لذلك:
NUM=$RANDOM if (( $NUM % 2 )) # if CONDITION then echo "$NUM is odd" fi # this is how you end an if statement
نصيحة: من الآن فصاعدًا، يُفترض أن تكون هذه الأمثلة جزءًا من نص برمجي أكبر وتخطئ إلى #!/bin/bash
في البداية. لا تنسى وضعه كأول سطر في نصك البرمجي، بالرغم من ذلك!
يمكنك أيضًا استخدام else
داخل تعليمة if لتحديد ما يجب القيام به إذا لم يتم تحقيق الشرط، أو تعليمة elif
(اختصاراً لـ”else if“) لتحديد شرط آخر إذا لم يتم تحقيق الشرط الأول:
NUM=$RANDOM if [ $NUM -eq 12 ] then echo "$NUM is my favorite number" elif (( $NUM % 2 )) then echo "$NUM is odd" else echo "$NUM is even"fi
تُستخدم ‘fi’ لإغلاق تعليمة if.
نصيحة:إذا كنت غير متأكد من كيفية كتابة الشرط نفسه، يمكنك النظر في الرمز والإشارات بالأقواس والأقواس المزدوجة.

تكرار سلسلة من الأوامر باستخدام حلقة for
الآن بعد أن تناولنا تشغيل الشيفرة شرطيًا، دعونا نلقي نظرة على كيفية تشغيل الشيفرة عددًا معينًا من المرات طالما تم تلبية شرط.
الحلقة for
مثالية لمثل هذه المهمة — بالتحديد بنية “ثلاثية التعبير”. الفكرة وراءها هو تعيين متغير محدد للحلقة وتغييره تدريجياً حتى يتم تحقيق شرط معين. إليك كيفية بنائه:
for (( ASSIGNMENT_EXPRESSION ; CONDITION_EXPRESSION ; UPDATE_EXPRESSION )) do COMMANDS done
على سبيل المثال، إذا كنت ترغب في تشغيل حلقة 10 مرات بقيم ل i تذهب من 0 إلى 9، فإن حلقتك for
قد تبدو على النحو التالي:
for (( i=0; i<10; i++ )) do echo $i done
لنقسمها:
i=0
is the assignment expression here. It’s run only once before the loop is executed, which is why it’s useful for initializing a variable.i<10
is our condition expression. This expression is evaluated before each iteration of a loop. If it is equal to zero (which means the same as “true” in Bash), the next iteration is not run.i++
is our update expression. It’s run after each iteration of a loop.

تكرار العناصر في قائمة
بالإضافة إلى بنية ثلاثية التعبير، يمكنك أيضًا استخدام in
لتحديد حلقة for
. يُستخدم هذا النحو البديل لتكرار مجموعة من العناصر.
أبسط مثال هو ببساطة تحديد مجموعة العناصر التي ترغب في تكرارها بعد الكلمة الرئيسية in
، مفصولة بمسافات. على سبيل المثال:
for i in 0 1 2 3 4 5 6 7 8 9 # space-separated list items do echo $i done
يمكنك أيضًا تكرار العناصر المخرجة بواسطة أمر:
for i in $(seq 0 1 9)
تُستخدم علامة $()
للاستبدال بالأمر بشكل عام – حيث يقوم بتشغيل الأمر ويتم استخدام مخرجاته كإدخال للأمر الأبوي المحيط به.
إذا كنت تكرر الأعداد الصحيحة، من الأفضل استخدام بنية نطاق Bash المدمجة، والتي تكون أكثر كفاءة من أمر seq
. ومع ذلك، هذه الصيغة متاحة فقط في إصدارات Bash الأحدث:
for i in {0..9}
، متوفر في Bash 3.for i in {0..9..1}
، متوفر في Bash 4، حيث يمثل الرقم الأخير الزيادة.
على نفس النحو، يمكنك تكرار السلاسل أيضًا:
for s in 'item1' 'item2' 'item3'
استخدام التوسيع النجمي للحصول على الملفات المطابقة لنمط معين
أحد حالات الاستخدام الأكثر شيوعًا لحلقات الـ for التي تمت مناقشتها في القسم السابق هو تكرار الملفات الفردية.
للتعامل مع هذا، نحتاج إلى تغطية ما يسمى “توسيع النجمات” أولاً. هذه ميزة في Bash تتيح لك تحديد أسماء الملفات باستخدام تطابق الأنماط. هناك أحرف خاصة تسمى wildcards تستخدم لتحديد تلك الأنماط.
قبل الانغماس في هذا، دعنا نلقي نظرة على بضعة أمثلة محددة:
echo *
: أمر يعيد أسماء جميع الملفات في الدليل الحالي الخاص بك، باستثناء الخفية.echo *.txt
: أمر يعيد أسماء جميع الملفات غير الخفية ذات الامتدادtxt
في الدليل الحالي الخاص بك.echo ????
: أمر يعيد أسماء جميع الملفات ذات أربعة أحرف في الدليل الحالي الخاص بك.
الـ الرموز المرقابة التي استخدمناها هنا هي * و ? . هناك رمز مرقاب آخر لم نستخدمه. إليك نظرة عامة:
- النجمة (
*
) تمثل أي عدد من الحروف (بما في ذلك 0) في اسم الملف أو الدليل. - العلامة الاستفهام (
?
) تمثل حرفًا واحدًا في اسم الملف أو الدليل. - نجمة مزدوجة (
**
) تمثل أي عدد من الحروف في مسار الملف الكامل. إنها ميزة في Bash 4 وما فوق ويجب تمكينها عن طريق تشغيلshopt -s globstar
. - الأقواس المربعة (
[]
) تُستخدم لتمثيل حرف داخل مجموعة من الرموز في اسم الملف أو الدليل. على سبيل المثال[st]ake
سيجد الملفات بأسماءsake
أوtake
، ولكن ليسstake
.
يرجى ملاحظة أن جميع الملفات الخفية (وهي الملفات التي تبدأ أسماؤها بنقطة .
) يتم تجاهلها عند استخدام توسيع النطاق.
الـ تعبير الأقواس المربعة يسمح بمزيد من التعقيد، بما في ذلك:
- النطاقات المحددة بواسطة القيمة الأولى والأخيرة — على سبيل المثال
[1-8]
- القضاء على بعض الأحرف عن طريق استخدام ! كأول حرف داخل القوسين — على سبيل المثال
[!3]
لمعالجة أحد هذه الرموز الخاصة كحرف عادي بدون أي معنى، يتم ببساطة وضع شرطة مائلة قبلها — على سبيل المثال \?
.

تكرار العمليات على الملفات باستخدام حلقة تكرارية
الآن بما أننا قد غطينا أساسيات توسيع النطاق، دعونا نلقي نظرة على كيفية استخدامه لتكرار العمليات على الملفات.
يمكننا ببساطة استخدام عوامل التوسيع في حلقة التكرار ذاتها. إليك مثال بسيط على حلقة تقوم بطباعة اسم كل ملف في الدليل الحالي:
for f in * do echo $f done
لطباعة أسماء كل ملف في الدليل الحالي بالإضافة إلى الدلائل الفرعية، تحقق من أنك تعمل بـ Bash 4.0 أو أعلى من خلال تشغيل bash --version
، ثم يمكنك تشغيل الأمر التالي:
shopt -s globstar # enables using ** for f in ** do echo $f done
نصيحة: إذا كنت تعمل بإصدار أقدم من Bash، فلن تتمكن من استخدام التوسيع مع حلقة for لهذا الغرض. أفضل خطوة لك ستكون استخدام الأمر find
، لكننا لن نتناول ذلك في هذا المقال.
هذه بالطبع فقط بعض الحلقات البسيطة التي يمكنك تشغيلها، لكن هناك المزيد الذي يمكنك القيام به. على سبيل المثال، لإعادة تسمية جميع ملفات JPG في مجلد ما لإعطائها اسم ملف متسلسل متسق، يمكنك تشغيل:
i=1 for f in *.jpg do mv -i -- "$f" "image_$i.jpg" let i=i+1 done

تشغيل الكود أثناء صحة شرط ما
الحلقة for ليست النوع الوحيد من الحلقات التي يمكننا استخدامها في Bash — لدينا أيضًا while
: هذا النوع من الحلقات يعمل طالما كان الشرط محددًا صحيحًا.
الصيغة مشابهة لصيغة حلقة for:
while CONDITION do COMMANDS done
لمثال عملي، هكذا يمكنك قراءة ملف سطرًا بسطر (باستثناء المسافات البيضاء في البداية أو النهاية) حتى تصل إلى نهاية الملف:
while read -r line do echo "$line" done < FILENAME # Replace FILENAME with the path to a text file you'd like to read

يمكنك أيضًا استبدال حلقة for بحلقة while، على سبيل المثال للتكرار من 0 إلى 9:
i=0 while [ $i -lt 10 ] do echo $i let i=i+1 done
ويمكنك أيضًا نظريًا تشغيل حلقة إلى الأبد. إليك مثال على أمر:
while true do echo "running forever" done
نصيحة: لإيقاف السيناريو، اضغط ببساطة على Ctrl+C.
على الرغم من أن هذه الحلقة اللانهائية قد تبدو غير مفيدة من النظرة الأولى، إلا أنها يمكن أن تكون فعليًا مفيدة للغاية، خاصة عند الجمع بينها مع تعليمة break
.
الخروج من الحلقة
تستخدم تعليمة break
للخروج من حلقة.
تتيح لك هذه التعليمة تشغيل حلقة لانهائية والخروج منها عند حدوث أي ظروف للخروج.
لنلقي نظرة على مثال بسيط، يمكننا تكرار حلقتنا من 0 إلى 9 باستخدام حلقة لانهائية مثل هذه:
i=0while true do if [ $i -eq 10 ] then break fi echo $i let i=i+1 done
إذا كان لديك عدة حلقات while متداخلة، يمكنك إضافة رقم بعد البيان break للإشارة إلى مستوى الحلقة التي تريد الخروج منها: break 1
يعتبر نفسه break
وسيخرج من أقرب حلقة محيطة، break 2
سيخرج من الحلقة تحت المستوى الذي تم فيه الحلقة، وهكذا.
دعنا نلقي نظرة سريعة على مثال، هذه المرة مع for حلقات، متكررة عبر كل توليفة كلمات مكونة من أربعة أحرف حتى يتم الوصول إلى كلمة “bash”:
for l4 in {a..z} do for l3 in {a..z} do for l2 in {a..z} do for l1 in {a..z} do echo "$l4$l3$l2$l1" if [ $l4 = "b" -a $l3 = "a" -a $l2 = "s" -a $l1 = "h" ] then break 4 fi done done done done
A related keyword that’s also worth a mention is continue
, which skips to the next iteration of the loop. Just like break
, it also takes an optional numeric argument that corresponds to the loop level.
ها هو مثال غبي حيث نتجاهل جميع الكلمات التي تحتوي على حرف E في قائمة الكلمات المختصرة من أربعة أحرف:
for l4 in {a..z} do if [ $l4 = "e" ] then continue fi for l3 in {a..z} do if [ $l3 = "e" ] then continue fi for l2 in {a..z} do if [ $l2 = "e" ] then continue fi for l1 in {a..z} do if [ $l1 = "e" ] then continue fi echo "$l4$l3$l2$l1" if [ $l4 = "b" -a $l3 = "a" -a $l2 = "s" -a $l1 = "h" ] then break 4 fi done done done done
يمكننا أيضًا تنفيذ كل تلك البيانات continue
على مستوى الحلقة الأعمق:
for l4 in {a..z} do for l3 in {a..z} do for l2 in {a..z} do for l1 in {a..z} do if [ $l4 = "e" ] then continue 4 fi if [ $l3 = "e" ] then continue 3 fi if [ $l2 = "e" ] then continue 2 fi if [ $l1 = "e" ] then continue fi echo "$l4$l3$l2$l1" if [ $l4 = "b" -a $l3 = "a" -a $l2 = "s" -a $l1 = "h" ] then break 4 fi done done done done

كيفية الحصول على إدخال المستخدم في نص قصيدة
في بعض الأحيان، تريد أن يتفاعل المستخدم مع النص الخاص بك مباشرة بدلاً من استخدام الحجج النصية الأولية. هنا يتدخل الأمر read
.
للحصول على إدخال المستخدم وحفظه في متغير يسمى NAME
، يجب أن تستخدم هذا الأمر:
read NAME
هذا هو أبسط شكل للأمر، يتكون فقط من اسم الأمر والمتغير الذي تريد حفظ الإدخال فيه.
عادة ما ترغب في توجيه المستخدم حتى يعرف ما يكتب. يمكنك القيام بذلك باستخدام الحجة -p
، بعد ذلك تكتب الرسالة التوجيهية المفضلة.
إليك كيف يمكنك طلب اسم معين وتخصيصه لمتغير يسمى اسم
:
read -p "Your name: " NAME echo "Your name is $NAME." # this line is here just to show that the name has been saved to the NAME variable

طباعة الرموز الخاصة في سلسلة نصية
هناك عدد من الرموز في باش يجب أن تكون حذرًا عند استخدامها. على سبيل المثال، الفراغات ضمن أسماء الملفات، الاقتباسات في السلاسل النصية، أو شرطات العكس تقريبًا في أي مكان.
لإبلاغ باش بتجاهل معناها الخاص في الأماكن المعينة، يمكنك إما “الهروب” منها أو لفها في علامة اقتباس حرفية.
“الهروب” من الرمز الخاص يعني إبلاغ باش بمعالجته كمجرد حرف بدون أي معنى خاص. للقيام بذلك، اكتب شرطة عكسية قبل هذا الحرف.
لنقل، لدينا ملف يسمى img \ 01 *DRAFT*، على سبيل المثال. في باش، يمكننا الإشارة إليه بهذه الطريقة:
img\ \\\ 01\ \*DRAFT\*
إليك قائمة غير شاملة للرموز الخاصة في باش:
- المسافات: فراغ، تاب، سطر فارغ
- علامات الاقتباس: ”، “”
- الأقواس، الأقواس المجردة، والأقواس الزاوية: ( )، { }، [ ]
- الأنابيب والتوجيهات: |، <، >
- الرموز المرقعة: *، ?
- متفرقات: !، #، ؛، =، &، ~، `
- الرمز ذاته للهروب: \
إذا كنت جديدًا على باش، قد يكون من العناء تذكر الرموز التي لها معنى خاص. لذلك، في العديد من الحالات، قد يكون من السهل استخدام “الاقتباس الحرفي”: ببساطة احتط النص الذي يحتوي على أي رموز خاصة بين علامات اقتباس واحدة، وسيتم تجاهل جميع الرموز الخاصة ضمن تلك الاقتباسات.
ها هي الطريقة التي ستبدو عليها لمثالنا:
'img \ 01 *DRAFT*'
ماذا لو كنت ترغب في استخدام حرف خاص، ولكنك ترغب في تفادي الآخرين؟ يمكنك تجنب كل حرف آخر باستخدام شرطة عكسية، لكن يمكنك أيضًا حفظ نفسك عناء وتحيط بكل شيء ما عدا هذا الحرف الخاص بعلامات تنصت.
على سبيل المثال، إذا كان لديك العديد من الملفات تحمل اسماءً مثل img \ 01 *v1 DRAFT*، img \ 01 *v2 DRAFT*، img \ 01 *ROUGH DRAFT*، وما إلى ذلك، وتريد استخدام توسيع لمطابقة جميع تلك الأسماء. ها هو ما يمكنك كتابته:
'img \ 01 *'*' DRAFT*'

إذا كانت العبارة التي تحتاج إلى كتابتها تحتوي على علامة اقتباس واحدة – على سبيل المثال img \ 01 *’FINAL’* – يمكنك استخدام استراتيجية مماثلة، وذلك بجمع السلاسل النصية وتفادي الحروف:
'img \ 01 '\''FINAL'\'
كيفية دمج السلاسل في Bash
لنفترض أن لديك سلسلة أو أكثر من المتغيرات – اسم أول واسم أخير، على سبيل المثال:
FIRST_NAME="Johnny"LAST_NAME="Appleseed"
لتجميع تلك المتغيرات في سلسلة واحدة، ربما مع فاصل مخصص، قم ببساطة بإنشاء سلسلة جديدة تتكون من تلك المتغيرات:
NAME="$LAST_NAME"', '"$FIRST_NAME"
يمكنك أيضًا استخدام علامات اقتباس مزدوجة مع المتغيرات المضمنة لهذا، باستخدام الأقواس المنحنية لفصل أسماء المتغيرات عن النص المحيط بها:
NAME="${LAST_NAME}, ${FIRST_NAME}"
تسمح Bash أيضًا باستخدام العامل += لإضافة نص إلى سلسلة، مثل هذا:
NAME='Appleseed'NAME+=', 'NAME+='Johnny'

تشغيل الأوامر داخل سلسلة
باش تسمح أيضًا باستخدام إخراج أمر داخل سلسلة نصية، المعروفة أيضًا باسم استبدال الأمر. ما عليك سوى تحيطة بـ $()
. على سبيل المثال، لطباعة الوقت الحالي، يمكنك تشغيل:
echo "Current timestamp: $(date)"

قد تتذكر هذا النحو اللغوي من مثال سابق عن حلقة for، عندما قمنا بتكرار مجموعة من الأعداد الصحيحة من 0 إلى 9:
for i in $(seq 0 1 9) do echo $i done
يتم تشغيل الأمر المستبدل في قائمة فرعية. وهذا يعني، على سبيل المثال، أن أي متغيرات يتم إنشاؤها أثناء الأمر لن تؤثر على البيئة التي تقوم فيها بتشغيل النص البرمجي الخاص بك.
ضبط وإرجاع أكواد الخروج في سكربت القالب
بالنسبة لـ سكربت أكثر تعقيدًا، من المعتاد أن يُعود برمجيًا بـ خروج كود — رقم بين 0 و 255 الذي يخبر الأشخاص ما إذا كان السكربت قد تم تشغيله بنجاح أم واجه خطأ.
أما عن الأرقام التي يجب استخدامها، يحدد الكتيب الرسمي لباش ما يلي:
- 0: تم تنفيذ البرنامج بنجاح.
- 2: تم استخدام البرنامج بطريقة غير صحيحة (على سبيل المثال بسبب وجود وسائط غير صالحة أو مفقودة).
- 1 و 3-124: أخطاء تم تعريفها من قبل المستخدم.
- 126: الأمر غير قابل للتنفيذ.
- 127: لم يتم العثور على الأمر.
- 125 و 128-255: حالات أخطاء يستخدمها القالب. إذا تم إيقاف عملية بواسطة إشارة
N
، فإن حالة الخروج هي 128 + N.
كما يمكنك رؤية، جميع الأرقام بخلاف الصفر تشير إلى نوع من الأخطاء. يُستخدم رمز الخروج 1
بشكل شائع للأخطاء العامة. في معظم الحالات، لن تحتاج إلى استخدام أي رمز خروج أعلى من 2
.
لإرجاع رمز خروج من نص الخاص بك، قم فقط باستخدام أمر exit
. على سبيل المثال، للخروج برمز 2، يُمكنك كتابة exit 2
.
إذا لم تستخدم أمر exit
في نصك، أو استخدمت الأمر دون تحديد رمز، سيتم إرجاع حالة الخروج لآخر أمر تم تنفيذه في نصك.
للحصول على رمز الخروج لآخر أمر تم تشغيله في وحدة التحكم الخاصة بك، استخدم المتغير $?: echo $?
.
كيفية استدعاء وظيفة
عند كتابة نص طويل أو يحتوي على تكرار لقطع الكود، قد ترغب في فصل بعض الأكواد في وظائف. هناك نوعان من التنسيقات التي يمكنك استخدامها لتعريف الوظائف: في كلتا الحالتين، يتم تضمين جميع أكواد الوظيفة داخل الأقواس المنحنية وتختلف فقط تصريح الوظيفة.
التنسيق الأكثر انضباطًا يستخدم الأقواس التي تتبع اسم الوظيفة لتعلن عن الوظيفة:
function_name () { echo "This is where your function code goes" }
التنسيق الآخر يستخدم الكلمة الأساسية function
أمام اسم الوظيفة.
function function_name { echo "This is where your function code goes" }
يجب أن يتم إعلان الدوال قبل استدعائها في السيناريو الخاص بك. تستدعي الدالة تمامًا كما تقوم بتنفيذ أمر عادي، باستخدام اسم الدالة كأمر:
function_name
تمرير البيانات إلى دالة باستخدام المتغيرات
في Bash، الدوال لا يمكن أن تأخذ وسيطات. لإرسال المعلومات إلى دالة، تحتاج إلى استخدام المتغيرات العامة في السيناريو الخاص بك.
على سبيل المثال:
is_your_name_defined () { if [ -z "$YOUR_NAME" ] then echo "It doesn't seem like I have your name." else echo "Is this your name: ${YOUR_NAME}?" fi } read -p "Your name: " YOUR_NAME is_your_name_defined
على عكس ما قد تكون معتادًا عليه في لغات أخرى، المتغيرات التي تعرفها داخل دالتك هي عامة، ومرئية للشيفرة خارج سيناريوك. لتعريف متغير يكون نطاقه محليا فقط لدالتك (مما يعني عدم إمكانية الوصول إليه من جميع الشيفرة خارجه)، استخدم الكلمة الرئيسية local
: على سبيل المثال local i=0
.
إذا كنت ترغب في إرجاع القيم من دالة، يجب عليك استخدام المتغيرات العامة أيضًا. في Bash، يمكن للدوال فقط إرجاع رموز الخروج، باستخدام الكلمة الرئيسية return
. دعونا نلقي نظرة على مثال:
is_your_name_defined () { if [ -z "$YOUR_NAME" ] then MESSAGE="It doesn't seem like I have your name." else MESSAGE="Is this your name: ${YOUR_NAME}?" fi } read -p "Your name: " YOUR_NAME is_your_name_defined echo $MESSAGE

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