قائمة طعام
مجانا
تسجيل
بيت  /  الملاحون/ كتابة نصوص باش. كتابة النصوص في لينكس (التعلم بالمثال) ما تحتاج إلى معرفته منذ البداية

كتابة نصوص باش. كتابة النصوص في لينكس (التعلم بالمثال) ما تحتاج إلى معرفته منذ البداية

كتابة البرامج النصية في Linux (التعلم عن طريق الأمثلة)

———————————————————————————-

1 المقدمة

ما تحتاجه لكتابة البرامج النصية
ملكية الأداة سطر الأوامروخياراتهم المطلوبة.
معرفة أساسية باللغة الإنجليزيةلن يتدخل مستوى المدرسة الابتدائية.

لماذا هناك حاجة للنصوص
أولاً ، إدارة خادم لينوكس ، بدرجة أو بأخرى ، ترجع إلى التنفيذ المنهجي لنفس الأوامر. علاوة على ذلك ، ليس من الضروري أن يقوم شخص بتنفيذ هذه الأوامر. يمكن برمجتها ليتم تنفيذها بواسطة آلة.
ثانيًا ، حتى مجرد القيام بمهمة عادية تصل (فجأة) إلى 20-1000 ... العمليات المتكررة أسهل بكثير في التنفيذ في البرنامج النصي.

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

كيف تكتب السيناريو
في حالتنا ، سيكون السيناريو ملف نصيمع سمات التنفيذ. إذا بدأ ملف البرنامج النصي بـ # !، وهو ما يسمى sha-bang في عالم UNIX ، فهذا يخبر النظام بالمترجم الذي يجب استخدامه لتنفيذ البرنامج النصي. إذا كان من الصعب فهم ذلك ، فتذكر فقط أننا سنبدأ في كتابة جميع البرامج النصية بالسطر #! / bin / bash أو #! / bin / sh ، ثم ستنتقل الأوامر والتعليقات عليها.

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

ما هي البرامج النصية التي قد نحتاجها:

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

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

———————————————————————————-

2. تعلم كتابة البرامج النصية بلغة BASH الداخلية
الأصل: https://www.linuxconfig.org/Bash_scripting_Tutorial

يفترض هذا الدليل عدم وجود معرفة مسبقة بكيفية كتابة النصوص (المشار إليها فيما بعد بالنصوص) باستخدام اللغة الداخليةسحق. بمساعدة هذا الدليل ، ستكتشف قريبًا أن البرمجة النصية غاية في الأهمية مهمة بسيطة. لنبدأ برنامجنا التعليمي بنص بسيط يطبع السلسلة "Hello World!" (مترجم من الإنجليزية - مرحباً بالجميع!)

1. سيناريو "مرحبًا بالجميع"
إليك مثالك الأول على برنامج bash النصي:

#! / بن / باش
صدى "مرحبا العالم"

غيّر إلى الدليل الذي يحتوي على ملف hello_world.sh الخاص بنا واجعله قابلاً للتنفيذ:

الكود: حدد الكل chmod + x hello_world.sh

قم بتشغيل البرنامج النصي للتنفيذ

الكود: حدد الكل $ ./hello_world.sh

2. سكربت أرشفة بسيط

#! / بن / باش
tar -czf myhome_directory.tar.gz / home / user

الرمز: حدد الكل $ ./backup.sh

$ du -sh myhome_directory.tar.gz
41 م myhome_directory.tar.gz

3. العمل مع المتغيرات
في هذا المثال ، نعلن عن متغير بسيط ونعرضه على الشاشة باستخدام الأمر echo.

#! / بن / باش
STRING = "HELLO WORLD !!!"
صدى $ STRING

الكود: حدد الكل $ ./hello_world.sh
مرحبا بالعالم!!!

نص الأرشفة الخاص بنا مع المتغيرات:

#! / بن / باش
OF = myhome_directory _ $ (التاريخ +٪ Y٪ m٪ d) .tar.gz
إذا = / المنزل / المستخدم
tar -czf $ OF $ IF

الرمز: حدد الكل $ ./backup.sh
tar: إزالة بادئة "\" من أسماء الأعضاء
$ du -sh * tar.gz
41 م myhome_directory_20100123.tar.gz

3.1 المتغيرات العالمية والمحلية

#! / بن / باش
# قم بتعريف متغير عالمي
# يمكن استخدام هذا المتغير في أي مكان في هذا البرنامج النصي
VAR = "متغير عام"
وظيفة باش (
# قم بتعريف متغير محلي
# مثل هذا المتغير صالح فقط للدالة التي تم التصريح بها
VAR المحلي = "المتغيرات المحلية"
صدى $ VAR
}
صدى $ VAR
سحق
# لاحظ أن المتغير العام لم يتغير
صدى $ VAR

الرمز: حدد الكل $ ./variables.sh
متغير عالمي
متغير محلي
متغير عالمي

4. تمرير الحجج إلى النص

#! / بن / باش
# استخدم المتغيرات المحددة مسبقًا للوصول إلى الوسائط
# طباعة الحجج على الشاشة
صدى $ 1 $ 2 $ 3 "-> echo $ 1 $ 2 $ 3"

# يمكننا أيضًا الوصول إلى الوسائط من خلال مصفوفة خاصة args = ("$ @")
# طباعة الحجج على الشاشة
صدى $ (args) $ (args) $ (args) '-> args = ("$ @")؛ صدى $ (args) $ (args) $ (args) '

# استخدم المتغير $ @ لعرض جميع المتغيرات مرة واحدة
صدى $ @ "-> صدى $ @"

استخدم المتغير $ # لعرض عدد الوسائط التي تم تمريرها إلى البرنامج النصي
echo عدد الوسائط التي تم تمريرها: $ # ‘-> echo عدد الوسائط التي تم تمريرها: $ #’

الكود: حدد كل البرنامج التعليمي لـ Bash Scripting $ ./arguments.sh
Bash Scripting Tutoring -> echo $ 1 $ 2 $ 3
دروس البرمجة باش -> args = ("$ @")؛ صدى $ (args) $ (args) $ (args)
Bash Scripting Tutoring -> echo $ @
عدد الوسائط التي تم تمريرها: 3 -> echo عدد الوسائط التي تم تمريرها: $ #

5. تنفيذ أوامر شل في البرنامج النصي

#! / بن / باش
# يستخدم اقتباسات خلفية»" "لتنفيذ أمر قذيفة
صدى "uname -o"
# الآن دعونا نحاول بدون اقتباسات
صدى uname -o

الكود: حدد الكل uname -o
جنو / لينكس
$ ./bash_backtricks.sh
جنو / لينكس
uname-o

كما ترى ، في الحالة الثانية ، تم عرض الأمر نفسه ، وليس نتيجة تنفيذه.

6. قراءة مدخلات المستخدم (التفاعلية)

#! / بن / باش
صدى صوت - "مرحبًا ، من فضلك اكتب الكلمة: \ c"
اقرأ كلمة
صدى "الكلمة التي أدخلتها هي: $ word"
echo -e "هل يمكنك إدخال كلمتين من فضلك؟ »
قراءة word1 word2
صدى "هنا هو الإدخال الخاص بك: \" $ word1 \ "\" $ word2 \ ""
echo -e "ما هو شعورك حيال البرمجة النصية لـ bash؟ »
يقوم الأمر read # الآن بتخزين الرد في متغير الإنشاء الافتراضي $ REPLY
يقرأ
صدى "لقد قلت $ REPLY ، يسعدني سماع ذلك! »
echo -e "ما هي ألوانك المفضلة؟ »
# -a يجعل الأمر قراءة للقراءة في مصفوفة
قراءة -الألوان
صدى "ألواني المفضلة هي أيضًا $ (ألوان) و $ (ألوان) و $ (ألوان) :-)"

الرمز: حدد الكل $ ./read.sh
مرحبًا ، من فضلك اكتب الكلمة: شيء ما
الكلمة التي أدخلتها هي: شيء ما
هل يمكنك إدخال كلمتين من فضلك؟
دبيان لينكس
ها هي إدخالك: "Debian" "Linux"
ما هو شعورك حيال البرمجة النصية باش؟
جيد
قلت جيدًا ، أنا سعيد لسماع ذلك!
ما هي ألوانك المفضلة؟
أزرق أخضر أسود
ألواني المفضلة هي الأزرق والأخضر والأسود :-)

7. استخدام المصيدة

#! / بن / باش
# يعلنون عن فخ
فخ بشتراب INT
# امسح الشاشة
واضح؛
# يتم تنفيذ وظيفة الخطاف عندما يضغط المستخدم على CTRL-C:
# سيعرض => تنفيذ روتين فرعي bash trap!
# لكن النص سيستمر في العمل
بشتراب ()
{
صدى "تم اكتشاف CTRL + C! ... تنفيذ مصيدة باش!"
}
# النص سيحسب حتى 10
بالنسبة لـ `seq 1 10` ؛ يفعل
صدى "$ a / 10 للخروج".
النوم 1 ؛
منتهي
صدى "Exit Bash Trap Example !!!"

الرمز: حدد الكل $ ./trap.sh
1/10
2/10
3/10
4/10
5/10
6/10

7/10
8/10
9/10
تم اكتشاف CTRL + C! ... تنفيذ مصيدة باش!
10/10
مثال على الخروج من Bash Trap !!!

كما ترى ، فإن مجموعة مفاتيح Ctrl-C لم توقف تنفيذ البرنامج النصي.

8. المصفوفات
8.1 التصريح عن مصفوفة بسيطة

#! / بن / باش
# قم بتعريف مصفوفة بسيطة تحتوي على 4 عناصر
ARRAY = ('Debian Linux' 'Redhat Linux' لينكس أوبونتو)
# احصل على عدد العناصر في المصفوفة
العناصر = $ (# ARRAY [@])

# حلقة خلال كل عنصر من عناصر المصفوفة
لـ ((أنا = 0 ؛ أنا<$ELEMENTS;i++)); do
صدى $ (ARRAY [$ (i)])
منتهي

الرمز: حدد الكل $. / arrays.sh
دبيان لينكس
ريدهات لينكس
أوبونتو
لينكس

8.2 تعبئة مصفوفة بقيم من ملف

#! / بن / باش
# نعلن مجموعة
تعلن -a صفيف
# أمر exec سيتم إنتاج # stdin (لوحة المفاتيح عادةً) من هذا الملف. هذا يجعل من الممكن القراءة
# محتويات الملف ، سطرًا بسطر ، وتحليل كل سطر تم إدخاله باستخدام sed و / أو awk.
إكسك 10 Letcount = 0

أثناء قراءة LINE<&10; do

ARRAY [$ count] = $ LINE
((العد ++))
منتهي

صدى عدد العناصر: $ (# ARRAY [@])
# عرض قيم الصفيف
صدى $ (ARRAY [@])
# أغلق الملف
تنفيذ 10> & -

الكود: حدد الكل $ cat bash.txt
دبيان لينكس
ريدهات لينكس
أوبونتو
لينكس
$ ./arrays.sh
عدد العناصر: 4
Debian Linux Redhat Linux Ubuntu Linux

9. شروط If-then-else
9.1 الاستخدام البسيط لشروط "if-else"
انتبه للمسافات الموجودة بين قوسين مربعين ، والتي بدونها لن يعمل الشرط.

#! / بن / باش
الدليل = "./ BashScripting"

# تحقق مما إذا كان الدليل موجودًا
إذا [-d $ دليل]؛ ثم
صدى "الدليل موجود"
آخر
صدى "الدليل غير موجود"
فاي

كود: حدد الكل $ ./if_else.sh
الدليل غير موجود
$ mkdir BashScripting
$ ./if_else.sh
الدليل موجود

9.2 شروط if-else المتداخلة

#! / بن / باش
# قم بتعريف متغير بقيمة 4
الاختيار = 4
# عرض
صدى "1. سحق"
صدى "2. برمجة »
صدى "3. درس تعليمي"

# نفذ بينما المتغير يساوي أربعة
# التكرار
بينما [$ Choice -eq 4]؛ يفعل

# قراءة مدخلات المستخدم
قراءة الاختيار
# حالة "if-else" المتداخلة
إذا [$ Choice -eq 1]؛ ثم

صدى "لقد اخترت كلمة: باش".

إذا [$ Choice -eq 2]؛ ثم
صدى "لقد اخترت كلمة: برمجة"
آخر

إذا [$ Choice -eq 3]؛ ثم
صدى "لقد اخترت كلمة: تعليمي"
آخر
صدى "الرجاء الاختيار بين 1-3!"
صدى "1. سحق"
صدى "2. برمجة »
صدى "3. درس تعليمي"
صدى-ن "الرجاء اختيار كلمة؟ »
الاختيار = 4
فاي
فاي
فاي
منتهي

الرمز: حدد الكل $ ./nested.sh
1. باش
2. البرمجة النصية
3. البرنامج التعليمي

5

1. باش
2. البرمجة النصية
3. البرنامج التعليمي
الرجاء اختيار كلمة
4
يرجى الاختيار بين 1-3!
1. باش
2. البرمجة النصية
3. البرنامج التعليمي
الرجاء اختيار كلمة
3
لقد اخترت كلمة: تعليمي

وهكذا ، أولاً يتم تنفيذ جسم حلقة "while" ، لأن يتم تعيين متغير الاختيار في البداية على أربعة. ثم نقرأ إدخال المستخدم فيه ، وإذا كان الإدخال لا يساوي 1.2 أو 3 ، فسنجعل المتغير الخاص بنا يساوي 4 مرة أخرى ، فيما يتعلق بتكرار جسم الحلقة (تحتاج إلى إدخال 1.2 أو 3 مرة أخرى).

10. المقارنات
10.1 المقارنات الحسابية

ملازم<
-Gt>
-le<=
-ge> =
-Eq ==
-واحد!

#! / بن / باش

NUM1 = 2
NUM2 = 2
إذا [$ NUM1 -eq $ NUM2] ؛ ثم
صدى "كلا القيمتين متساويتان"
آخر
صدى "القيم غير متساوية"
فاي

الرمز: حدد الكل $ ./equals.sh
كلا القيمتين متساويتان

#! / بن / باش
# قم بتعريف المتغيرات بقيم عددية
NUM1 = 2
NUM2 = 3
إذا [$ NUM1 -eq $ NUM2] ؛ ثم
صدى "كلا القيمتين متساويتان"
آخر
صدى "القيم غير متساوية"
فاي

الرمز: حدد الكل $ ./equals.sh
القيم ليست متساوية

#! / بن / باش
# قم بتعريف المتغيرات بقيم عددية
NUM1 = 2
NUM2 = 1
إذا [$ NUM1 -eq $ NUM2] ؛ ثم
صدى "كلا القيمتين متساويتان"
أليف [$ NUM1 -gt $ NUM2] ؛ ثم
صدى "$ NUM1 أكبر من $ NUM2"
آخر
صدى "$ NUM2 أكبر من $ NUM1"
فاي

الرمز: حدد الكل $ ./equals.sh
2 أكبر من 1

10.2 مقارنات بين الحروف والنصوص

نفس الشيء
! = ليس نفس الشيء
< меньще чем
> أكثر من
-n s1 المتغير s1 ليس فارغًا
-z s1 المتغير s1 فارغ

#! / بن / باش

S1 = "باش"

S2 = "برمجة"
إذا [$ S1 = $ S2] ؛ ثم

آخر
صدى "الجمل غير متساوية"
فاي

الكود: حدد الكل $ ./statement.sh
السلاسل ليست متساوية

#! / بن / باش
# قم بتعريف المتغير الرمزي S1
S1 = "باش"
# قم بتعريف المتغير الرمزي S2
S2 = "باش"
إذا [$ S1 = $ S2] ؛ ثم
صدى "كلا السلاسل متساوية"
آخر
صدى "الجمل غير متساوية"
فاي

الكود: حدد الكل $ ./statement.sh
كلا الجملتين متساويتان

11. فحص الملفات

B filename Block ملف خاص
-c filename ملف الأحرف الخاصة
-d اسم الدليل تحقق من وجود الدليل
-e filename تحقق من وجود الملف
-f filename تحقق من وجود ملف عادي وليس دليلاً
-G filename تحقق مما إذا كان الملف موجودًا ومملوكًا لمعرف المجموعة الفعال.
-g filename صحيح إذا كان الملف موجودًا وكان set-group-id.
-k اسم الملف بت مثبت
-L اسم الملف ارتباط رمزي
-O filename صحيح إذا كان الملف موجودًا ويملكه معرف المستخدم الفعال.
-r filename تحقق مما إذا كان الملف يمكن قراءته
-S filename تحقق مما إذا كان الملف مأخذ توصيل
-s filename تحقق مما إذا كان حجم الملف غير صفري
-u filename تحقق من تعيين بت معرف معرف الملف
-w filename تحقق مما إذا كان الملف قابلاً للكتابة
-x filename تحقق مما إذا كان الملف قابلاً للتنفيذ

#! / بن / باش
ملف = "./ ملف"
إذا [-e $ ملف] ؛ ثم
صدى "الملف موجود"
آخر
صدى "الملف غير موجود"
فاي

الرمز: حدد كل $ ls
file.sh
$ ./file.sh
الملف غير موجود
ملف $ touch
ليرة سورية
ملف file.sh
$ ./file.sh
الملف موجود

وبالمثل بالنسبة للمثال ، يمكننا استخدام حلقات "while" للتحقق مما إذا كان الملف غير موجود. سينام هذا البرنامج النصي حتى يوجد الملف. لاحظ أن Bash سلبي "!" الذي ينفي (يقلب) خيار e.

12. دورات
12.1. لحلقة

#! / بن / باش
# لحلقة
لـ f بـ $ (ls / var /) ؛ يفعل
صدى $ و
منتهي

تشغيل حلقة for من سطر أوامر bash:

الكود: حدد الكل لـ f في $ (ls / var /) ؛ فعل صدى $ f؛ الكود المنجز: حدد الكل لـ f في $ (ls / var /) ؛ فعل صدى $ f؛ منتهي
النسخ الاحتياطية
مخبأ
يتحطم
ألعاب
ليب
محلي
قفل
سجل
بريد
يختار، يقرر
يجري
بكرة
tmp
www

12.2. حائط اللوب

#! / بن / باش
العدد = 6
# حائط اللوب
بينما [$ COUNT -gt 0] ؛ يفعل

دع COUNT = COUNT-1
منتهي

الكود: حدد الكل $ ./ while_loop.sh
قيمة العد: 6
قيمة العد: 5
قيمة العد: 4
قيمة العد: 3
قيمة العد: 2
قيمة العد: 1

12.3. حتى حلقة

#! / بن / باش
COUNT = 0
# حتى الحلقة
حتى [$ COUNT -gt 5] ؛ يفعل
صدى قيمة العد: COUNT دولار
دع COUNT = COUNT + 1
منتهي

الكود: حدد الكل $ ./until_loop.sh
قيمة العد: 0
قيمة العد: 1
قيمة العد: 2
قيمة العد: 3
قيمة العد: 4
قيمة العد: 5

12.4. حلقات بشروط ضمنية
في المثال التالي ، حالة حلقة while loop هي وجود إدخال معياري.
سيعمل جسم الحلقة طالما أن هناك شيئًا يجب إعادة توجيهه من الإخراج القياسي إلى أمر القراءة.

#! / بن / باش
# سيجد هذا البرنامج النصي المسافات ويزيلها
# في الملفات ، مع استبدالها بشرطة سفلية
DIR = "."
التحكم في الحلقة باستخدام الأمر read عن طريق إعادة توجيه الإخراج في الحلقة.
اعثر على $ DIR -type f | أثناء قراءة الملف ؛ يفعل
# استخدم فئة POSIX [: space:] للعثور على مسافات في أسماء الملفات
إذا [["$ file" = * [[: space:]] *]]؛ ثم
# استبدال المسافات بالشرطات السفلية
mv "$ file" `echo $ file | tr "‘ ‘_’
فاي ؛
منتهي

الكود: حدد الكل ls -1
script.sh
touch $ "ملف به مسافات"
-1 ليرة سورية
ملف بمسافات
script.sh
$ ./script.sh
-1 ليرة سورية
file_with_spaces
script.sh

13. الوظائف

#! / بن / باش
يمكن الإعلان عن # وظائف بأي ترتيب
وظيفة function_B (
وظيفة الصدى B.
}
وظيفة function_A (
صدى 1 دولار
}
وظيفة function_D (
وظيفة صدى د.
}
function_C (
صدى 1 دولار
}
# وظائف الاتصال
# تمرير المعلمة للوظيفة أ
function_A "الوظيفة أ"
function_B
# تمرير المعلمة لوظيفة C.
function_C "الوظيفة ج".
function_D

الرمز: حدد الكل $ ./functions.sh
الوظيفة أ.
الوظيفة ب.
الوظيفة ج.
الوظيفة D.

14. حدد المشغل - حدد

#! / بن / باش
PS3 = "اختر كلمة واحدة:"
# يختار
حدد كلمة في "لينكس" "باش" "البرمجة النصية" "البرنامج التعليمي"
يفعل
صدى "الكلمة التي اخترتها هي: $ word"
# استراحة ، وإلا فإن الحلقة ستكون لانهائية.
استراحة
منتهي
خروج 0

الرمز: حدد الكل $ ./select.sh
1) لينكس
2) باش
3) البرمجة النصية
4) البرنامج التعليمي
اختر كلمة واحدة: 4
الكلمة التي اخترتها هي: تعليمي

15. عامل التحديد - الحالة

#! / بن / باش
صدى "ما هي لغة البرمجة / البرمجة النصية المفضلة لديك"
صدى "1) باش"
صدى "2) بيرل"
صدى "3) فيتون"
صدى "4) c ++"
صدى "5) لا أعرف!"
قراءة الحالة
# هيكل بسيط لاختيار الحالة
# لاحظ أن $ case في هذا المثال هي مجرد متغير
# وليس من الضروري تسمية ذلك. هذا مجرد مثال
$ حالة في
1) صدى "اخترت bash" ؛؛
2) صدى "اخترت بيرل" ؛؛
3) صدى "لقد اخترت فيتون" ؛؛
4) صدى "لقد حددت c ++" ؛؛
5) الخروج
esac

الرمز: حدد الكل $ ./case.sh
ما هي لغة البرمجة / البرمجة النصية المفضلة لديك
1) باش
2) بيرل
3) فيتون
4) سي ++
5) لا أعرف!
4
لقد حددت c ++

———————————————————————————-

يمكن الحصول على مزيد من المعلومات التفصيلية من مصادر مختلفة ، على سبيل المثال هنا
الأصل: https://www.linuxconfig.org/Bash_scripting_Tutorial
https://ruslandh.narod.ru/howto_ru/Bash-Prog-Intro/
https://bug.cf1.ru/2005-03-17/programmin… -book.html

https://ubuntologia.ru/forum/viewtopic.php؟f=109&t=2296

ل كتابة نص بسيط باشنحتاج إلى القيام بالخطوات البسيطة التالية:

كيف يعمل كل شيء:

يعتبر السطر الأول من البرنامج النصي #! / bin / bash ضروريًا لتشغيل البرنامج النصي الخاص بنا بنجاح.

السطر الثاني mkdir testdir ينشئ الدليل testdir

يسمح لك السطر الثالث cd testdir بالتغيير إلى الدليل الذي تم إنشاؤه testdir

فريق يلمسفي السطر التالي ، المس file1 file2 file3 ينشئ ثلاثة ملفات

ويتيح لنا الأمر الأخير في سطر البرنامج النصي ls -al عرض محتويات المجلد الحالي ، حيث ظهرت ثلاثة ملفات فارغة بفضل السطر السابق.

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

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

اليوم سنتحدث عن مخطوطات باش. هذه نصوص سطر أوامر مكتوبة لقشرة bash. هناك قذائف أخرى ، مثل zsh و tcsh و ksh ، لكننا سنركز على bash. هذه المادة مخصصة للجميع ، الشرط الوحيد هو القدرة على العمل على سطر أوامر Linux.



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

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

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

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

Getconf ARG_MAX
يعد سطر الأوامر أداة رائعة ، ولكن عليك إدخال أوامر فيه في كل مرة تحتاج إليها. ماذا لو كتبنا مجموعة من الأوامر إلى ملف واستدعينا هذا الملف ببساطة لتنفيذها؟ في الواقع ، يُطلق على الملف الذي نتحدث عنه اسم البرنامج النصي لسطر الأوامر.

كيف تعمل البرامج النصية باش

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

#! / بن / باش
في مكان آخر من هذا الملف ، يتم استخدام رمز التجزئة للإشارة إلى التعليقات التي لا يعالجها الغلاف. ومع ذلك ، فإن السطر الأول عبارة عن حالة خاصة ، حيث توجد علامة تجزئة متبوعة بعلامة تعجب (تسمى shebang) ويخبر المسار إلى bash النظام أن النص قد تمت كتابته خصيصًا لـ bash.

يتم فصل أوامر Shell عن طريق موجز سطر ، ويتم فصل التعليقات بعلامة الجنيه. هذا ما يبدو عليه:

#! / bin / bash # هذا تعليق pwd whoami
هنا ، تمامًا كما هو الحال في سطر الأوامر ، يمكنك كتابة أوامر على سطر واحد ، مع الفصل بينها بفاصلة منقوطة. ومع ذلك ، إذا كتبت أوامر على سطور مختلفة ، فسيكون من الأسهل قراءة الملف. في أي حال ، سوف تقوم القشرة بمعالجتها.

تعيين الأذونات على ملف البرنامج النصي

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


محاولة تشغيل ملف برنامج نصي بأذونات تم تكوينها بشكل غير صحيح

لنجعل الملف قابلاً للتنفيذ:

Chmod + x ./myscript
الآن دعنا نحاول تنفيذه:

./myscript
بعد تعيين الأذونات ، كل شيء يعمل كما ينبغي.


نجح تشغيل البرنامج النصي bash

إخراج الرسالة

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

#! / bin / bash # تعليقنا هنا صدى "الدليل الحالي هو:" pwd echo "المستخدم الذي قام بتسجيل الدخول هو:" whoami
إليك ما يحدث بعد تشغيل البرنامج النصي المحدث.


إخراج الرسائل من برنامج نصي

يمكننا الآن عرض تسميات توضيحية باستخدام الأمر echo. إذا كنت لا تعرف كيفية تحرير ملف باستخدام أدوات Linux ، أو لم تواجه أمر echo من قبل ، فقم بإلقاء نظرة على هذه المقالة.

استخدام المتغيرات

تسمح لك المتغيرات بتخزين المعلومات في ملف البرنامج النصي ، على سبيل المثال ، نتائج الأوامر لتستخدمها أوامر أخرى.

لا حرج في تنفيذ الأوامر الفردية دون تخزين نتائج عملهم ، لكن إمكانيات هذا النهج محدودة للغاية.

هناك نوعان من المتغيرات التي يمكن استخدامها في نصوص bash:

  • متغيرات البيئة
  • متغيرات المستخدم

متغيرات البيئة

تحتاج أوامر shell أحيانًا إلى العمل مع بعض بيانات النظام. على سبيل المثال ، إليك كيفية عرض الدليل الرئيسي للمستخدم الحالي:

#! / bin / bash # display user home echo "Home for the current user is: $ HOME"
يرجى ملاحظة أنه يمكننا استخدام متغير النظام $ HOME في علامتي اقتباس مزدوجتين ، وهذا لن يمنع النظام من التعرف عليه. إليك ما يحدث إذا قمت بتشغيل البرنامج النصي أعلاه.


استخدام متغير البيئة في البرنامج النصي

ولكن ماذا لو كنت تريد عرض علامة الدولار؟ دعنا نجرب هذا:

صدى "لدي دولار واحد في جيبي"
سيكتشف النظام علامة الدولار في سلسلة محددة بعلامات اقتباس ويفترض أننا أشرنا إلى متغير. سيحاول البرنامج النصي عرض قيمة المتغير غير المحدد $ 1. هذا ليس ما نحتاجه. ما يجب القيام به؟

في مثل هذه الحالة ، يساعد استخدام حرف التحكم بالخط المائل العكسي قبل علامة الدولار على:

صدى "لدي \ $ 1 في جيبي"
سينتج النص الآن ما هو متوقع بالضبط.


استخدام تسلسل الهروب لإخراج علامة الدولار

متغيرات المستخدم

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

كما هو الحال مع متغيرات النظام ، يمكن الوصول إلى متغيرات المستخدم باستخدام علامة الدولار:
TNW-CUS-FMP - رمز ترويجي لخصم 10٪ على خدماتنا ، متاح للتفعيل في غضون 7 أيام
#! / bin / bash # متغيرات الاختبار الصف = 5 شخص = "آدم" صدى "$ شخص ولد جيد ، إنه في الصف $"
إليكم ما يحدث بعد تشغيل مثل هذا البرنامج النصي.


المتغيرات المخصصة في البرنامج النصي

استبدال الأمر

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

ويمكن أن يتم ذلك بطريقتين.

  • مع حرف backtick "" "
  • مع بناء $ ()
عند استخدام الأسلوب الأول ، احرص على عدم استخدام علامة اقتباس مفردة بدلاً من العلامة الخلفية. يجب إرفاق الأمر برمزين من هذا القبيل:

mydir = `pwd`
في النهج الثاني ، يتم كتابة الشيء نفسه على النحو التالي:

mydir = $ (pwd)
والسيناريو ، في النهاية ، قد يبدو كالتالي:

#! / bin / bash mydir = $ (pwd) echo $ mydir
في سياق عمله ، سيتم تخزين إخراج الأمر pwd في متغير mydir ، وستقع محتوياته ، باستخدام الأمر echo ، في وحدة التحكم.


البرنامج النصي الذي يحفظ نتائج الأمر في متغير

عمليات رياضية

لإجراء عمليات حسابية في ملف نصي ، يمكنك استخدام بناء مثل $ ((a + b)):

#! / bin / bash var1 = $ ((5 + 5)) echo $ var1 var2 = $ (($ var1 * 2)) echo $ var2


العمليات الحسابية في البرنامج النصي

هيكل التحكم if-then

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

إذا كان الأمر ثم يأمر fi
وهنا مثال عملي:

#! / bin / bash if pwd ثم صدى "إنه يعمل" fi
في هذه الحالة ، إذا اكتمل الأمر pwd بنجاح ، ستتم طباعة النص "يعمل" إلى وحدة التحكم.

دعنا نستخدم المعرفة التي لدينا ونكتب سيناريو أكثر تعقيدًا. لنفترض أنك تريد العثور على مستخدم في / etc / passwd ، وإذا كان بإمكانك العثور عليه ، فأبلغ عن وجوده.

#! / bin / bash user = likegeeks إذا كان grep $ user / etc / passwd ثم صدى "The user $ user Exists" fi
هذا ما يحدث بعد تشغيل هذا البرنامج النصي.


بحث المستخدم

استخدمنا هنا الأمر grep للعثور على المستخدم في ملف / etc / passwd. إذا كان الأمر grep غير مألوف لك ، فيمكن العثور على وصفه هنا.

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

بناء عنصر التحكم if-then-else

لكي يتمكن البرنامج من الإبلاغ عن كل من نتائج البحث الناجح والفشل ، سنستخدم بنية if-then-else. إليك كيفية إعداده:

if command ثم أوامر else أوامر fi
إذا أعاد الأمر الأول صفرًا ، مما يعني أنه نجح ، فسيكون الشرط صحيحًا ولن ينخفض ​​التنفيذ إلى فرع else. خلاف ذلك ، إذا تم إرجاع شيء آخر غير الصفر ، مما يعني الفشل ، أو نتيجة خاطئة ، فسيتم تنفيذ الأوامر بعد الآخر.

لنكتب السيناريو التالي:

#! / bin / bash user = anotherUser if grep $ user / etc / passwd ثم صدى "The user $ user Exists" else echo "المستخدم $ user غير موجود" fi
تم تنفيذه على طول الفرع الآخر.


تشغيل برنامج نصي ببناء if-then-else

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

إذا كان command1 يأمر elif command2 ثم يأمر fi
إذا كان الأمر الأول يُرجع صفرًا ، مما يشير إلى النجاح ، فسيتم تنفيذ الأوامر الموجودة في الكتلة الأولى ، وإلا ، إذا كان الشرط الأول خاطئًا ، وإذا كان الأمر الثاني يُرجع صفرًا ، فسيتم تنفيذ الكتلة الثانية من التعليمات البرمجية.

#! / bin / bash user = anotherUser if grep $ user / etc / passwd ثم صدى "The user $ user Exists" elif ls / home ثم echo "المستخدم غير موجود ولكن على أي حال يوجد دليل ضمن / home" fi
في مثل هذا البرنامج النصي ، يمكنك ، على سبيل المثال ، إنشاء مستخدم جديد باستخدام الأمر useradd إذا لم يُرجع البحث أي نتائج ، أو القيام بشيء آخر مفيد.

مقارنة الأرقام

في البرامج النصية ، يمكنك مقارنة القيم الرقمية. يوجد أدناه قائمة بالأوامر ذات الصلة.
n1 -eq n2 تعطي النتيجة صحيحة إذا كانت n1 تساوي n2.
n1 -ge n2 تعطي النتيجة صحيحة إذا كانت n1 أكبر من أو تساوي n2.
n1 -gt n2 تعطي النتيجة صحيحة إذا كانت n1 أكبر من n2.
n1 -le n2 تعطي النتيجة صحيحة إذا كانت n1 أقل من أو تساوي n2.
n1 -lt n2 تعطي النتيجة صحيحة إذا كانت n1 أقل من n2.
n1 -ne n2 تعطي النتيجة صحيحة إذا كانت n1 لا تساوي n2.

كمثال ، دعنا نجرب أحد عوامل المقارنة. لاحظ أن التعبير محاط بأقواس مربعة.

#! / bin / bash val1 = 6 إذا [$ val1 -gt 5] ثم صدى "قيمة الاختبار $ val1 أكبر من 5" صدى آخر "قيمة الاختبار $ val1 ليست أكبر من 5 بوصات fi
هذا ما سيخرجه هذا الأمر.


مقارنة الأرقام في النصوص

قيمة المتغير val1 أكبر من 5 ، ونتيجة لذلك ، يتم تنفيذ فرع عامل المقارنة ثم يتم عرض الرسالة المقابلة في وحدة التحكم.

مقارنة السلاسل

يمكن للنصوص أيضًا مقارنة قيم السلسلة. تبدو عوامل المقارنة بسيطة للغاية ، لكن مشغلي مقارنة السلاسل لديهم خصائص معينة ، والتي سنتطرق إليها أدناه. هنا قائمة المشغلين.
str1 = str2 تختبر السلاسل من أجل المساواة ، وتعود صحيحًا إذا كانت السلاسل متطابقة.
s tr1! = str2 تعطي النتيجة صحيحة إذا لم تكن السلاسل متطابقة.
شارع 1< str2 Возвращает истину, если str1 меньше, чем str2 .
str1> str2 تعطي النتيجة صحيحة إذا كانت str1 أكبر من str2.
-n str1 تعطي النتيجة صحيحة إذا كان طول str1 أكبر من الصفر.
-z str1 تعطي النتيجة صحيحة إذا كان طول str1 يساوي صفر.

فيما يلي مثال على مقارنة سلسلة في نص برمجي:

#! / bin / bash user = "likegeeks" إذا كان [$ user = $ USER] ثم صدى "المستخدم $ المستخدم هو المستخدم الحالي المسجل الدخول" fi
نتيجة لتنفيذ البرنامج النصي ، حصلنا على ما يلي.


مقارنة السلاسل في النصوص

فيما يلي ميزة واحدة لمقارنة السلاسل تستحق الذكر. وهي عوامل التشغيل ">" و "<» необходимо экранировать с помощью обратной косой черты, иначе скрипт будет работать неправильно, хотя сообщений об ошибках и не появится. Скрипт интерпретирует знак «>'كأمر إعادة توجيه الإخراج.

إليك كيف يبدو العمل مع هؤلاء المشغلين في الكود:

#! / bin / bash val1 = text val2 = "another text" إذا [$ val1 \>
ها هي نتائج البرنامج النصي.


مقارنة السلاسل ، تم إلقاء تحذير

لاحظ أن النص ، بالرغم من تنفيذه ، يعطي تحذيرًا:

./myscript: سطر 5: [: وسيطات كثيرة جدًا
للتخلص من هذا التحذير ، قم بلف $ val2 التنصيص:

#! / bin / bash val1 = text val2 = "another text" إذا كان [$ val1 \> "$ val2"] ثم صدى "$ val1 أكبر من $ val2" else echo "$ val1 أقل من $ val2" fi
الآن كل شيء يعمل كما ينبغي.


مقارنة السلاسل

ميزة أخرى من ">" و "<» заключается в том, как они работают с символами в верхнем и нижнем регистрах. Для того, чтобы понять эту особенность, подготовим текстовый файл с таким содержимым:

Likegeeks likeegeeks
احفظه باسم myfile ، ثم قم بتشغيل الأمر التالي في المحطة:

فرز ملفي
سيقوم بفرز الأسطر من الملف كما يلي:

Likegeeks Likegeeks
يقوم أمر الفرز ، افتراضيًا ، بفرز السلاسل بترتيب تصاعدي ، أي أن الحرف الصغير في مثالنا أقل من الحرف الكبير. لنعد الآن نصًا يقارن نفس السلاسل:

#! / bin / bash val1 = Likegeeks val2 = likegeeks إذا كان [$ val1 \> $ val2] ثم صدى "$ val1 أكبر من $ val2" else echo "$ val1 أقل من $ val2" fi
إذا قمت بتشغيله ، اتضح أن العكس هو الصحيح - أصبح الحرف الصغير الآن أكبر من الحرف الكبير.


أمر الفرز ومقارنة السلسلة في ملف البرنامج النصي

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

يستخدم أمر الفرز بدوره ترتيب الفرز المحدد في إعدادات لغة النظام.

عمليات فحص الملف

ربما يتم استخدام الأوامر أدناه غالبًا في نصوص bash. أنها تسمح لك للتحقق ظروف مختلفةبخصوص الملفات. فيما يلي قائمة بهذه الأوامر.
-d file للتحقق مما إذا كان الملف موجودًا وأنه دليل.
-e file للتحقق من وجود الملف.
-f file للتحقق مما إذا كان الملف موجودًا وما إذا كان ملفًا.
-r file للتحقق مما إذا كان الملف موجودًا وقابل للقراءة.
-s file للتحقق مما إذا كان الملف موجودًا وليس فارغًا.
-w file للتحقق مما إذا كان الملف موجودًا وقابل للكتابة.
-x file للتحقق مما إذا كان الملف موجودًا وقابل للتنفيذ.
file1 -nt file2 للتحقق مما إذا كان file1 أحدث من file2.
file1 -ot file2 للتحقق مما إذا كان file1 أقدم من file2.
-O file للتحقق مما إذا كان الملف موجودًا ومملوكًا للمستخدم الحالي.
-G file للتحقق مما إذا كان الملف موجودًا وما إذا كان معرف المجموعة الخاص به يطابق معرف مجموعة المستخدم الحالي.

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

لنجرب أحد الأوامر عمليًا:

#! / bin / bash mydir = / home / likegeeks إذا [-d $ mydir] ثم صدى "دليل $ mydir موجود" cd $ mydir ls else echo "دليل $ mydir غير موجود" fi
هذا البرنامج النصي ، لدليل موجود ، سيعرض محتوياته.


سرد محتويات الدليل

نعتقد أنه يمكنك تجربة بقية الأوامر بنفسك ، فجميعها تنطبق وفقًا لنفس المبدأ.

نتائج

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

بالطبع ، تعامل جميع أولئك الذين يتواصلون مع نظام التشغيل Linux مرة واحدة على الأقل (على الأقل سمعوا على وجه اليقين) مع غلاف أوامر BASH. لكن BASH ليست مجرد أوامر shell ، بل هي أيضًا لغة برمجة نصية ممتازة.
الغرض من هذه المقالة هو تعريف المستخدمين الأقرب إلى bash ، والتحدث عن بناء الجملة ، والتقنيات الأساسية وميزات اللغة ، حتى المستخدم العاديتمكنت بسرعة من كتابة نص بسيط لأداء العمل الروتيني اليومي (-أسبوعيًا ، -شهريًا) أو ، على سبيل المثال ، "على ركبتي" لعمل برنامج نصي للنسخ الاحتياطي للدليل.

مقدمة

BASH - Bourne-Again SHell (والتي يمكن ترجمتها كـ "reborn shell" أو "Bourne-Again SHell again") ، مترجم الأوامر الأكثر شيوعًا في الأنظمة الشبيهة بـ Unix ، خاصة في GNU / Linux. فيما يلي عدد من الأوامر المضمنة التي سنستخدمها لإنشاء البرامج النصية الخاصة بنا.

الخروج لحلقة، بينما أو حتى
تابع تنفيذ التكرار التالي للحلقة for أو while أو until
صدى طباعة الحجج مفصولة بمسافة للإخراج القياسي
خروج الخروج من القشرة
يقوم التصدير بتصنيف الوسيطات كمتغيرات ليتم تمريرها إلى العمليات الفرعية في البيئة
يتذكر التجزئة أسماء المسار الكاملة للأوامر المعطاة كوسيطات حتى لا يتم البحث عنها في المرة التالية التي يتم استدعاؤها
قتل يرسل إشارة إنهاء لعملية
يعرض pwd دليل العمل الحالي
read يقرأ سطرًا من مدخلات shell ويستخدمه لتعيين قيم للمتغيرات المحددة. \
يؤدي الإرجاع إلى إنهاء دالة shell بالقيمة المحددة
يحرك التحول المعلمات الموضعية إلى اليسار
يقيم test التعبير الشرطي
مرات يطبع اسم المستخدم ووقت النظام الذي تستخدمه الصدفة وأحفادها
تحدد trap الأوامر التي سيتم تنفيذها عندما تستقبل الصدفة إشارة
يؤدي عدم ضبطه إلى تدمير متغيرات الصدفة
انتظر انتظار عملية الطفل للخروج والإبلاغ عن حالة الخروج.

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

ما تحتاج أن تعرفه منذ البداية

1. يجب أن يبدأ أي نص برمجي bash بالسطر:

#! / بن / باش
في هذا السطر بعد #! يتم تحديد المسار إلى مترجم bash ، لذلك إذا كنت قد قمت بتثبيته في مكان آخر (حيث يمكنك معرفة ذلك عن طريق كتابة whereis bash) فقم بتغييره إلى مسارك.
2. تبدأ التعليقات بالرمز # (باستثناء السطر الأول).
3. في bash ، المتغيرات ليس لها نوع (سيتم مناقشتها أدناه)

متغيرات ومعلمات البرنامج النصي

دعني أعطيك مثالًا صغيرًا سنقوم بتحليله:

#! / بن / باش
# حدد مكان تخزين مترجم bash
parametr1 = $ 1 # اضبط المتغير parametr1 على قيمة المعلمة الأولى للبرنامج النصي
script_name = $ 0 # اضبط متغير script_name على قيمة اسم البرنامج النصي
echo "لقد قمت بتشغيل برنامج نصي بالاسم $ script_name والمعلمة $ parametr1" # يقوم الأمر echo بإخراج سلسلة معينة ، ويتم الوصول إلى المتغيرات من خلال $ variable_name.
صدى "لقد قمت بتشغيل نص برمجي باسم $ script_name مع المعلمة $ parametr1" # هنا نرى علامات اقتباس أخرى ، والفرق هو أنه لا يوجد استبدال متغير في علامات الاقتباس الفردية.
خروج 0 #Exit مع الكود 0 (إكمال البرنامج النصي بنجاح)

[بريد إلكتروني محمي]: ~ $ ./test.sh qwerty
لقد قمت بتشغيل برنامج نصي باسم ./test.sh باستخدام المعلمة qwerty
لقد قمت بتشغيل برنامج نصي بالاسم $ script_name والمعلمة $ parametr1

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

$ DIRSTACK - محتويات الجزء العلوي من دليل المكدس
محرر $- محرر النصتقصير
EUID $ - المعرف الفريد الفعال (UID). إذا استخدمت برنامج su لتنفيذ الأوامر كمستخدم آخر ، فإن هذا المتغير يحتوي على UID الخاص بهذا المستخدم ، بينما ...
UID $ - ... يحتوي على الهوية الحقيقية، والذي يتم تعيينه فقط عند تسجيل الدخول.
$ FUNCNAME - اسم الوظيفة الحالية في البرنامج النصي.
مجموعات $ - مجموعة من المجموعات التي ينتمي إليها المستخدم الحالي
$ HOME - دليل المستخدم الرئيسي
$ HOSTNAME - اسم مضيفك
$ HOSTTYPE - هندسة المضيف.
LC_CTYPE $ - متغير داخلي يحدد ترميز الأحرف
OLDPWD $ - دليل العمل القديم
OSTYPE دولار - نوع نظام التشغيل
$ PATH - مسار بحث البرنامج
$ PPID - معرّف العملية الأصل
SECONDS دولارًا - وقت تشغيل البرنامج النصي (بالثواني)
# $ - العدد الإجمالي للمعلمات التي تم تمريرها إلى البرنامج النصي
$ * - تم تمرير جميع الوسائط إلى البرنامج النصي (معروضة في سلسلة)
$ @ - مثل السابق ، ولكن يتم عرض المعلمات في عمود
$! - PID لآخر عملية تعمل في الخلفية
$$ - PID للبرنامج النصي نفسه

شروط

أعتقد أن العوامل الشرطية مألوفة لكل من حاول كتابة برامج على شيء ما. في باش ، الشروط مكتوبة على النحو التالي. الطريقة (كالعادة في المثال):
#! / بن / باش
source = $ 1 # ضع المعامل الأول للبرنامج النصي في المتغير المصدر
dest = $ 2 # أدخل المعامل الثاني من البرنامج النصي في متغير dest

إذا [["$ source" -eq "$ dest"]] # اقتبس أسماء المتغيرات للمقارنة. -Eq - مقارنة منطقية تدل على "يساوي"
ثم # إذا كانوا متساوين حقًا ، إذن
صدى "Destination $ dest و source $ source هما نفس الملف!" #display رسالة خطأ ، لأن المصدر $ و $ dest متساويان
خروج 1 # خروج مع خطأ (1 - رمز الخطأ)
else # إذا لم يكونوا متساوين
cp $ source $ dest # ثم نفّذ الأمر cp: انسخ المصدر إلى الوجهة
صدى "نسخة ناجحة!"
fi # دلالة على نهاية الشرط.

نتيجة تنفيذ البرنامج النصي:
[بريد إلكتروني محمي]: ~ $ ./primer2.sh 1 1
مقدم الطلب 1 والمصدر 1 هما نفس الملف!
[بريد إلكتروني محمي]: ~ $ ./primer2.sh 1 2
نسخ سعيد!

يتم استخدام بنية if-then-else على النحو التالي:
لو<команда или набор команд возвращающих код возврата(0 или 1)>
ثم
<если выражение после if истино, то выполняется этот блок>
آخر
<если выражение после if ложно, тот этот>
يمكن أن تعمل الهياكل [[، [، الاختبار ، (())) أو أي أمر لينكس آخر (أو عدة) كأوامر تعيد رمز الإرجاع.
اختبار - يستخدم للمقارنة المنطقية. بعد التعبير ، يلزم وجود قوس إغلاق "]"
[هو مرادف لأمر الاختبار
[[- نسخة موسعة من "[" (منذ الإصدار 2.02) (كما في المثال) ، ضمنها || (او و). يجب أن يحتوي على قوس إغلاق "]]"
(()) - مقارنة رياضية.
لبناء شروط متعددة المستويات للنموذج:
لو...
ثم ....
آخر
لو ....
ثم....
آخر ....

لإيجاز الكود وقابليته للقراءة ، يمكنك استخدام البنية:
لو..
ثم ...
أليف ...
ثم ...
أليف ...

شروط. متعدد الخيارات

إذا كنت بحاجة إلى مقارنة أي متغير واحد مع كمية كبيرةالمعلمات ، من الأنسب استخدام بيان الحالة.
#! / بن / باش
صدى "حدد محررًا للتشغيل:"
صدى "1 تشغيل نانو"
صدى "2 تشغيل برنامج vi"
صدى "3 ابدأ برنامج emacs"
صدى "4 خروج"
اقرأ عمل # هنا نقرأ في المتغير $ doing من الإدخال القياسي

حالة $ القيام به في
1)
/ usr / bin / nano # إذا كان $ doing يساوي 1 ثم قم بتشغيل nano
;;
2)
/ usr / bin / vi # إذا احتوى $ عمل على 2 ، فابدأ vi
;;
3)
/ usr / bin / emacs # إذا كان $ doing يحتوي على 3 ثم ابدأ emacs
;;
4)
خروج 0
;;
*) # إذا تم إدخال شيء من لوحة المفاتيح غير موصوف في الحالة ، فقم بما يلي:
صدى "تم إدخال إجراء غير صالح"

Esac #end بيان الحالة.

نتيجة العمل:
[بريد إلكتروني محمي]: ~ $ ./menu2.sh
حدد محررًا لبدء تشغيله:
1 إطلاق نانو
2 ابتداء من السادس
3 إطلاق emacs
4 خروج

بعد تحديد رقم والضغط على Enter ، سيبدأ المحرر الذي اخترته (ما لم تكن ، بالطبع ، جميع المسارات صحيحة وتثبيت هؤلاء المحررين :))
فيما يلي قائمة بالعوامل المنطقية المستخدمة لبناء if-then-else-fi:
-z # سطر فارغ
-n # سلسلة ليست فارغة
=، (==) # سلاسل متساوية
! = # سلاسل غير متساوية
-Eq # يساوي
- واحد # غير متكافئ
-lt ، (<) # меньше
-le، (<=) # меньше или равно
-gt، (>) # المزيد
-ge ، (> =) # أكبر من أو يساوي
! # ارتباط التعبير المنطقي
-a ، (&&) # منطقي AND
-o ، (||) # منطقي "OR"

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

محدث:إصلاح بعض الخلل
محدث:تم تحديث الجزء المتعلق بشروط if-then-else

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

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

نحتاج أولاً إلى فهم ماهية الوظيفة في سياقنا. الوظيفة عبارة عن مجموعة من الأوامر ، موحّدة باسم واحد ، تؤدي مهمة محددة. تسمى الوظيفة باسمها ، ويمكن أن تأخذ المعلمات وتعيد نتيجة العمل. باختصار ، تعمل وظائف Bash تمامًا كما تفعل في لغات البرمجة الأخرى.

بناء الجملة الخاص بإنشاء دالة بسيط للغاية:

function_name () (قائمة الأوامر)

يجب ألا يتطابق اسم الوظيفة مع أي من الأوامر أو الوظائف الموجودة ، ويتم كتابة جميع الأوامر في نص الوظيفة في سطر جديد.

وظيفة بسيطة

لنكتب دالة صغيرة تطبع سلسلة على الشاشة:

الدالة $ vi.sh

#! / بن / باش
printstr () (
صدى "مرحبا العالم"
}
printstr

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

chmod u + x function.sh

كل شيء يعمل ، الآن دعونا نعقد المهمة ، دعونا نحاول تمرير الحجج إلى الوظيفة.

الحجج الوظيفية

يجب تمرير وسيطات الوظيفة عند الاستدعاء ، ويتم قراءتها بنفس طريقة قراءة وسيطات البرنامج النصي. صيغة استدعاء دالة ذات معلمات bash هي:

اسم وظيفة الوسيطة 1 الوسيطة 2 ... الحجة

كما ترى ، كل شيء بسيط للغاية. المعلمات مفصولة بمسافة. دعنا الآن نحسن وظيفتنا بحيث تُخرج السلسلة التي حددناها:

! / بن / باش
printstr () (
صدى 1 دولار
}
printstr "Hello world"

يمكنك الحصول على خيارات متعددة:

! / بن / باش
printstr () (
صدى 1 دولار
صدى دولار 2
صدى 3 دولارات
صدى 5 دولارات
}
printstr "arg1" "arg2" "arg3" "arg4" "arg5"

هناك طريقة أخرى لاستخراج الوسيطات ، كما في C ، باستخدام المكدس. نحضر الوسيطة الأولى ، ثم نتقدم بمؤشر مكدس الوسيطات بواحد ، ونجلب الوسيطة الأولى مرة أخرى. وما إلى ذلك وهلم جرا:

! / بن / باش
printstr () (
صدى 1 دولار
يحول
صدى 1 دولار
يحول
صدى 1 دولار
يحول
صدى 1 دولار
}
printstr "arg1" "arg2" "arg3" "arg4"

إرجاع نتيجة دالة

لا يمكنك استخدام الوظائف مع معلمات bash فحسب ، بل يمكنك أيضًا الحصول على نتيجة العمل منها. يتم استخدام أمر الإرجاع لهذا الغرض. يقوم بإنهاء الوظيفة وإرجاع القيمة الرقمية لرمز الإرجاع. يمكن أن يكون من 0 إلى 255:

! / بن / باش
printstr () (
عودة 134
}
printstr
صدى $؟

إذا كنت بحاجة إلى استخدام القيمة المرجعة لوظيفة bash بدلاً من رمز الحالة ، فاستخدم echo. لا يتم إخراج السلسلة مباشرة إلى المحطة ، ولكن يتم إرجاعها كنتيجة للدالة ويمكن كتابتها إلى متغير ثم استخدامها:

! / بن / باش
printstr () (
صدى "اختبار"
}
VAR = $ (printstr)
صدى $ VAR

وظائف التصدير

يمكنك إتاحة وظيفة خارج البرنامج النصي باستخدام أمر التصريح:

! / بن / باش
printstr () (
صدى "مرحبا العالم"
}
تعلن -x -f printstr

ثم قم بتشغيل البرنامج النصي باستخدام الأمر المصدر:

وظيفة المصدر
$ printstr

العودية

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

! / بن / باش
printstr () (
صدى "مرحبا العالم"
printstr
}
printstr

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

المتغيرات المحلية في دالة

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

! / بن / باش
printstr () (
VAR المحلي = 1 دولار
صدى $ (فار)
}
printstr "Hello World"

مكتبات الوظائف

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

test1 () (
صدى "مرحبا العالم من 1" ؛
}
test2 () (
صدى "مرحبا العالم من 2" ؛
}
test3 () (
صدى "مرحبا العالم من 3" ؛
}

لنقم الآن بإنشاء برنامج نصي يستخدم وظائفنا. يمكنك استيراد المكتبة باستخدام الأمر المصدر أو ببساطة عن طريق تحديد اسم البرنامج النصي:

! / بن / باش
مصدر lib.sh
اختبار 1
اختبار 2
اختبار 3

الاستنتاجات

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