Ultimate magazine theme for WordPress.

أساسيات أتمتة Bash والبرمجة النصية (الجزء 2) – CloudSavvy IT

5

شترستوك / موبي

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

أساسيات أتمتة Bash والبرمجة النصية

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

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

كثافة ترميز باش واختصارها

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

على سبيل المثال ، كود Bash التالي:

true || echo 'untrue'

والتي يمكن قراءتها كـ لا تفعل شيئًا ، وافعل ذلك بنجاح (الخروج من الكود 0) ، وإذا فشل ذلك (يمكنك قراءة لغة Bash || كـ OR) إخراج النص “غير صحيح”، يمكن كتابتها أيضًا على النحو التالي:

if [ ! true ]; then
  echo 'untrue'
fi

مما يجعل الكود مختلفًا قليلاً ، لكنه في الأساس يفعل الشيء نفسه.

يمكن قراءة هذا بدوره كـ إذا كان صحيحا لا (يشار إليه بواسطة ! المصطلح) صحيح ، ثم إخراج النص “غير صحيح”.

طريقتان للبرمجة في Bash ؛  نفس الوظيفة ، رمز مختلف تمامًا

ينتج عن كلا النصين المصغرين نفس الإخراج الفارغ ، مثل صحيح ليس غير صحيح.

إن العديد من الأوامر والأدوات المتاحة (أو القابلة للتثبيت) من سطر الأوامر وفيه يزيد من حجم الإزاحة المحتملة بين البرامج النصية المقروءة بشكل كبير والتعليمات البرمجية التي يصعب فهمها والكثافة والمختصرة.

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

V="$(sleep 2 & fg; echo -n '1' | sed 's|[0-9]|a|')" && echo "${V}" | sed 's|[a-z]|2|g' || echo 'fail'

مثال معقد على خط واحد

هذا هو برنامج نصي نموذجي من سطر واحد من Bash يستخدم الأوامر sleepو fgو echo، و sed بالإضافة إلى العديد من التعبيرات الاصطلاحية والتعبيرات العادية في Bash بحيث تنام بشكل أساسي لمدة ثانيتين ، وإخراج بعض النصوص وتحويل هذا النص باستخدام التعبيرات العادية. يتحقق البرنامج النصي أيضًا بانتظام من شروط / نتائج الأوامر السابقة باستخدام مصطلحات Bash الاصطلاحية || (إذا لم تنجح ، افعل ما يلي) و && (إذا نجحت ، افعل ما يلي)

لقد قمت بترجمة هذا ، بوظيفة مطابقة تقريبية ، إلى نص أكمل ، مع بعض التعديلات. على سبيل المثال ، قمنا بتبديل ملف fg (أحضر ال sleep وضع الأمر في الخلفية مرة أخرى في المقدمة ، وانتظر حتى ينتهي كعمليات عادية غير خلفية) إلى wait التي ستنتظر PID للنوم (بدأ بواسطة eval وتم التقاطها باستخدام لغة Bash $!) للإنهاء.

#!/bin/bash

CMD="sleep 2"
eval ${CMD} &
wait $!
EXIT_CODE=${?}

V="$(echo -e "${CMD}n1" | sed 's|[0-9]|a|')"

if [ ${EXIT_CODE} -eq 0 ]; then
  echo "${V}" | sed 's|[a-z]|2|g'
  EXIT_CODE=${?}
  if [ ${EXIT_CODE} -ne 0 ]; then
    echo 'fail'
  fi
fi

بدلاً من ذلك ، نفس المعقد الموجود على السطر في نص كامل

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

لمعرفة المزيد حول كتابة التعبيرات العادية ، ألق نظرة على كيفية تعديل النص باستخدام التعبيرات العادية باستخدام sed Stream Editor.

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

إذا كان عليك إنشاء كود كثيف ومختصر ، يمكنك تقديم الكثير من التعليقات المضمنة. سطر مسبوق بـ a # يعتبر سطر تعليق / ملاحظة ، ورمز # يمكن استخدامه حتى في نهاية السطر بعد أي أمر قابل للتنفيذ ، لنشر تعليق لاحق يشرح الأمر ، أو العبارة الشرطية ، إلخ. على سبيل المثال:

# This code will sleep one second, twice
sleep 1  # First sleep
sleep 1  # Second sleep

اقتباسات مفردة أم مزدوجة؟

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

echo ' $(echo "Hello world") '
echo " $(echo 'Hello world') "

علامات الاقتباس المفردة مقابل علامات الاقتباس المزدوجة في Bash في مثال hello world

في المثال الأول النص $(echo "Hello world") يُنظر إليه على أنه نص حرفي ، وبالتالي يكون الإخراج ببساطة $(echo "Hello world") . لكن بالنسبة للمثال الثاني ، الناتج هو Hello world .

قام مترجم Bash بتحليل النص بين علامتي اقتباس مزدوجتين لمعرفة ما إذا كان سيجد أي مصطلحات Bash خاصة للعمل عليها. تم العثور على أحد هذه المصطلحات في $( ... ) الذي يبدأ بشكل أساسي مجموعة فرعية وينفذ كل ما هو موجود بين ( ... ) التعابير. فكر في الأمر على أنه قشرة داخل صدفة – قشرة فرعية – تنفذ كل ما تمرره إليها كأمر جديد تمامًا. يتم بعد ذلك تمرير إخراج أي أمر أو أوامر من هذا القبيل مرة أخرى إلى غلاف المستوى الأعلى وإدخاله في المكان المحدد الذي بدأ فيه الجزء الفرعي.

وهكذا ، تم تنفيذ مجموعتنا الفرعية echo 'Hello world' منها الإخراج Hello world. بمجرد الانتهاء من ذلك ، انتهى الجزء الفرعي والنص Hello world تم إدخاله بدلاً من $( ... ) استدعاء subshell (فكر في الأمر مثل جميع ملفات $( ... ) يتم استبدال الكود بأي ناتج تولده المجموعة الفرعية.

النتيجة بالنسبة للقشرة العلوية هي الأمر التالي: echo " Hello world "، منها الناتج Hello world كما رأينا.

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

وهذا ليس لأن Bash مرن مع سلاسل متعددة الاقتباس (تقبل echo 'test'"More test"'test' لحسن الحظ تمامًا على سبيل المثال) ، ولكن نظرًا لأن الجزء الفرعي عبارة عن غلاف في حد ذاته ، وبالتالي يمكن استخدام علامات الاقتباس المزدوجة ، مرة أخرى ، داخل المجموعة الفرعية. دعنا نثبت ذلك بمثال إضافي:

echo "$(echo "$(echo "more double quotes")")"

يقبل Bash بسهولة علامات الاقتباس المزدوجة المتكررة داخل قشرة فرعية

سيعمل هذا بشكل جيد وسينتج الإخراج more double quotes. يقبل كل من الجزأين الفرعيين المتداخلين (يعملان داخل الهيكل الرئيسي الذي تقوم بتنفيذ هذا منه) بدوره بعلامات الاقتباس المزدوجة ولا يتم إنشاء أي أخطاء ، حتى إذا تم تضمين العديد من علامات الاقتباس المزدوجة عبر الأمر أحادي الخط. يوضح هذا بعضًا من قوة برمجة Bash.

في تلخيص

بعد استكشاف كثافة التشفير ، أدركنا قيمة كتابة التعليمات البرمجية سهلة القراءة. إذا كان علينا عمل تعليمات برمجية كثيفة ومختصرة ، فيمكننا إضافة الكثير من التعليقات المضمنة باستخدام # للمساعدة في سهولة القراءة. نظرنا إلى علامات الاقتباس المفردة والمزدوجة وكيف تختلف وظيفتها اختلافًا جوهريًا. نظرنا أيضًا بإيجاز في التعليقات المضمنة في البرامج النصية ، بالإضافة إلى وظائف المجموعة الفرعية عند تنفيذها من داخل سلسلة مقتبسة مزدوجة. أخيرًا ، رأينا كيف يمكن أن تستخدم المجموعة الفرعية مجموعة أخرى من علامات الاقتباس المزدوجة دون التأثير على علامات الاقتباس المزدوجة المستخدمة في مستوى أعلى بأي شكل من الأشكال. ترقبوا الجزء 3!

اترك رد

لن يتم نشر عنوان بريدك الإلكتروني.