النقاط الرئيسية
- المتغيرات هي رموز مسماة تمثل سلاسل أو قيم رقمية. يتم التعامل معها باعتبارها قيمتها عند استخدامها في الأوامر والتعبيرات.
- يجب أن تكون أسماء المتغيرات وصفية ولا يمكن أن تبدأ برقم أو تحتوي على مسافات. يمكن أن تبدأ بعلامة سفلية ويمكن أن تحتوي على أحرف أبجدية رقمية.
- يمكن استخدام المتغيرات لتخزين القيم والإشارة إليها. ويمكن تغيير قيمة المتغير، ويمكن الإشارة إليها باستخدام علامة الدولار $ قبل اسم المتغير.
المتغيرات ضرورية إذا كنت تريد كتابة البرامج النصية وفهم ما سيفعله الكود الذي تنوي نسخه ولصقه من الويب بجهاز الكمبيوتر الذي يعمل بنظام Linux. سنساعدك في البدء!
ما هو المتغير في Bash؟
المتغيرات عبارة عن رموز تحمل أسماء تمثل إما سلسلة أو قيمة رقمية. عند استخدامها في الأوامر والتعبيرات، يتم التعامل معها كما لو كنت قد كتبت القيمة التي تحملها بدلاً من اسم المتغير.
لإنشاء متغير، ما عليك سوى توفير اسم وقيمة له. يجب أن تكون أسماء المتغيرات وصفية وتذكرك بالقيمة التي تحملها. لا يمكن أن يبدأ اسم المتغير برقم، ولا يمكن أن يحتوي على مسافات. ومع ذلك، يمكن أن يبدأ بعلامة سفلية. وبصرف النظر عن ذلك، يمكنك استخدام أي مزيج من الأحرف الأبجدية الرقمية الكبيرة والصغيرة.
أمثلة على متغيرات Bash
هنا، سننشئ خمسة متغيرات. التنسيق هو كتابة الاسم وعلامة المساواة =
، والقيمة. لاحظ أنه لا توجد مسافة قبل أو بعد علامة التساوي. غالبًا ما يشار إلى إعطاء متغير قيمة باسم تعيين قيمة للمتغير.
سنقوم بإنشاء أربعة متغيرات سلسلة ومتغير رقمي واحد،
my_name=Dave
my_boost=Linux
him=Popeye
his_boost=Spinach
this_year=2019
ل انظر القيمة محجوز في متغير، استخدم echo
الأمر. يجب أن تسبق اسم المتغير بعلامة الدولار $
عندما تقوم بالإشارة إلى القيمة التي تحتويها، كما هو موضح أدناه:
echo $my_name
echo $my_boost
echo $this_year
دعونا نستخدم جميع متغيراتنا مرة واحدة:
echo "$my_boost is to $me as $his_boost is to $him (c) $this_year"
تحل قيم المتغيرات محل أسمائها. يمكنك أيضًا تغيير قيم المتغيرات. لتعيين قيمة جديدة للمتغير، my_boost
، ما عليك سوى تكرار ما فعلته عندما قمت بتعيين قيمته الأولى، كما يلي:
my_boost=Tequila
إذا قمت بإعادة تشغيل الأمر السابق، فستحصل الآن على نتيجة مختلفة:
echo "$my_boost is to $me as $his_boost is to $him (c) $this_year"
لذا، يمكنك استخدام نفس الأمر الذي يشير إلى نفس المتغيرات والحصول على نتائج مختلفة إذا قمت بتغيير القيم الموجودة في المتغيرات.
سنتحدث عن اقتباس المتغيرات لاحقًا. في الوقت الحالي، إليك بعض الأشياء التي يجب تذكرها:
- متغير بين علامتي اقتباس مفردتين
'
يتم التعامل معه كسلسلة حرفية، وليس كمتغير. - المتغيرات بين علامتي الاقتباس
"
يتم التعامل معها كمتغيرات. - للحصول على القيمة الموجودة في متغير، عليك توفير علامة الدولار
$
. - متغير بدون علامة الدولار
$
يوفر فقط اسم المتغير.
يمكنك أيضًا إنشاء متغير يأخذ قيمته من متغير موجود أو عدد من المتغيرات. يحدد الأمر التالي متغيرًا جديدًا يسمى drink_of_the_Year,
ويعين لها القيم المجمعة لـ my_boost
و this_year
المتغيرات:
drink_of-the_Year="$my_boost $this_year"
echo drink_of_the-Year
كيفية استخدام متغيرات Bash في البرامج النصية
ستكون النصوص البرمجية معوقة تمامًا بدون المتغيرات. توفر المتغيرات المرونة التي تجعل النص البرمجي حلاً عامًا وليس حلاً محددًا. لتوضيح الفرق، إليك نص برمجي يحسب عدد الملفات الموجودة في /dev
دليل.
اكتب هذا في ملف نصي، ثم احفظه باسم fcnt.sh
(بالنسبة لـ “عدد الملفات”):
#!/bin/bashfolder_to_count=/devfile_count=$(ls $folder_to_count | wc -l)echo $file_count files in $folder_to_count
قبل أن تتمكن من تشغيل البرنامج النصي، يجب عليك جعله قابلاً للتنفيذ، كما هو موضح أدناه:
chmod +x fcnt.sh
اكتب ما يلي لتشغيل البرنامج النصي:
./fcnt.sh
يؤدي هذا إلى طباعة عدد الملفات الموجودة في /dev
الدليل. إليك كيفية عمله:
- متغير يسمى
folder_to_count
تم تعريفه، وتم ضبطه لحمل السلسلة “/dev.” - متغير آخر يسمى
file_count
يتم تعريف هذا المتغير. يأخذ هذا المتغير قيمته من استبدال الأمر. هذه هي عبارة الأمر بين الأقواس$( )
لاحظ أن هناك علامة الدولار$
قبل القوس الأول. هذا البناء$( )
يقوم بتقييم الأوامر الموجودة بين الأقواس، ثم يقوم بإرجاع قيمتها النهائية. في هذا المثال، يتم تعيين هذه القيمة إلىfile_count
متغير. بقدر ما يتعلق الأمرfile_count
يتعلق الأمر بالمتغير، الذي تم تمرير قيمة إليه للاحتفاظ بها؛ ولا يتعلق الأمر بكيفية الحصول على القيمة. - الأمر الذي تم تقييمه في استبدال الأمر يقوم بتنفيذ
ls
قائمة الملفات الموجودة في الدليلfolder_to_count
المتغير الذي تم تعيينه على “/dev.” لذا، يقوم البرنامج النصي بتنفيذ الأمر “ls /dev.” - يتم توجيه الناتج من هذا الأمر إلى
wc
الأمر.-l
يؤدي خيار (عدد الأسطر) إلىwc
ل احسب عدد الخطوط في الناتج منls
الأمر. نظرًا لأن كل ملف مدرج في سطر منفصل، فهذا هو عدد الملفات والدلائل الفرعية في الدليل “/dev”. يتم تعيين هذه القيمة إلىfile_count
عامل. - يستخدم السطر الأخير الصدى لإخراج النتيجة.
لكن هذا لا يعمل إلا مع الدليل “/dev”. كيف يمكننا جعل البرنامج النصي يعمل مع أي دليل؟ كل ما يتطلبه الأمر هو تغيير بسيط واحد.
كيفية استخدام معلمات سطر الأوامر في البرامج النصية
العديد من الأوامر، مثل ls
و wc
، خذ معلمات سطر الأوامر. توفر هذه المعلومات للأمر، حتى يعرف ما تريد أن يفعله. إذا كنت تريد ls
للعمل على دليل منزلك و لإظهار الملفات المخفية أيضًايمكنك استخدام الأمر التالي، حيث يتم وضع علامة التلدة ~
و ال -a
(الكل) الخيار عبارة عن معلمات سطر أوامر:
ls ~ -a
يمكن لبرامجنا النصية قبول معلمات سطر الأوامر. يتم الإشارة إليها باسم $1
بالنسبة للمعلمة الأولى، $2
كالثاني، وهكذا، حتى $9
للمعلمة التاسعة. (في الواقع، هناك $0
، أيضًا، ولكن هذا مخصص دائمًا لاحتواء النص.)
يمكنك الرجوع إلى معلمات سطر الأوامر في البرنامج النصي كما تفعل مع المتغيرات العادية. دعنا نعدل البرنامج النصي الخاص بنا، كما هو موضح أدناه، ونحفظه بالاسم الجديد fcnt2.sh
:
#!/bin/bashfolder_to_count=$1file_count=$(ls $folder_to_count | wc -l)echo $file_count files in $folder_to_count
هذه المرة، folder_to_count
يتم تعيين قيمة معلمة سطر الأوامر الأولى للمتغير، $1
.
يعمل باقي البرنامج النصي تمامًا كما كان من قبل. فبدلاً من حل محدد، أصبح البرنامج النصي الخاص بك الآن حلاً عامًا. ويمكنك استخدامه في أي دليل لأنه ليس مبرمجًا للعمل فقط مع “/dev”.
إليك كيفية جعل البرنامج النصي قابلاً للتنفيذ:
chmod +x fcnt2.sh
الآن، جرّب الأمر مع بعض الدلائل. يمكنك تنفيذ الأمر “/dev” أولاً للتأكد من حصولك على نفس النتيجة كما في السابق. اكتب ما يلي:
./fnct2.sh /dev
./fnct2.sh /etc
./fnct2.sh /bin
ستحصل على نفس النتيجة (207 ملفات) كما في السابق بالنسبة للدليل “/dev”. وهذا أمر مشجع، وستحصل على نتائج خاصة بالدليل لكل من معلمات سطر الأوامر الأخرى.
لتقصير النص، يمكنك الاستغناء عن المتغير، folder_to_count
، كليًا، ومجرد مرجع $1
في جميع أنحاء، على النحو التالي:
#!/bin/bash file_count=$(ls $1 wc -l) echo $file_count files in $1
العمل مع المتغيرات الخاصة
لقد ذكرنا $0
، والذي يتم تعيينه دائمًا على اسم ملف البرنامج النصي. يتيح لك هذا استخدام البرنامج النصي للقيام بأشياء مثل طباعة اسمه بشكل صحيح، حتى إذا تمت إعادة تسميته. يعد هذا مفيدًا في مواقف التسجيل، حيث تريد معرفة اسم العملية التي أضافت إدخالاً.
وفيما يلي المتغيرات المحددة مسبقًا الخاصة الأخرى:
- #$:كم عدد معلمات سطر الأوامر التي تم تمريرها إلى البرنامج النصي.
- $@:جميع معلمات سطر الأوامر التي تم تمريرها إلى البرنامج النصي.
- $؟:حالة الخروج من آخر عملية يتم تشغيلها.
- $$:معرف العملية (PID) للبرنامج النصي الحالي.
- المستخدم:اسم المستخدم الذي يقوم بتنفيذ البرنامج النصي.
- اسم المضيف:اسم المضيف للكمبيوتر الذي يقوم بتشغيل البرنامج النصي.
- ثواني:عدد الثواني التي تم تشغيل البرنامج النصي فيها.
- $عشوائي:إرجاع رقم عشوائي.
- لايننو:إرجاع رقم السطر الحالي للنص البرمجي.
هل تريد رؤية كل هذه العناصر في نص واحد، أليس كذلك؟ يمكنك ذلك! احفظ ما يلي كملف نصي يسمى، special.sh
:
#!/bin/bashecho "There were $# command line parameters"echo "They are: $@"echo "Parameter 1 is: $1"echo "The script is called: $0"# any old process so that we can report on the exit statuspwdecho "pwd returned $?"echo "This script has Process ID $$"echo "The script was started by $USER"echo "It is running on $HOSTNAME"sleep 3echo "It has been running for $SECONDS seconds"echo "Random number: $RANDOM"echo "This is line number $LINENO of the script"
اكتب ما يلي لجعله قابلاً للتنفيذ:
chmod +x special.sh
الآن، يمكنك تشغيله باستخدام مجموعة من معلمات سطر الأوامر المختلفة، كما هو موضح أدناه.
متغيرات البيئة
يستخدم Bash متغيرات البيئة لتحديد وتسجيل خصائص البيئة التي ينشئها عند تشغيله. تحتوي هذه المتغيرات على معلومات يمكن لـ Bash الوصول إليها بسهولة، مثل اسم المستخدم والإعدادات المحلية وعدد الأوامر التي يمكن لملف السجل الخاص بك الاحتفاظ بها ومحررك الافتراضي وغير ذلك الكثير.
لرؤية متغيرات البيئة النشطة في جلسة Bash الخاصة بك، استخدم هذا الأمر:
env | less
إذا قمت بالتمرير خلال القائمة، فقد تجد بعض العناصر التي قد يكون من المفيد الرجوع إليها في البرامج النصية الخاصة بك.
كيفية تصدير المتغيرات
عندما يتم تشغيل البرنامج النصي، فإنه يكون في عملية خاصة به، ولا يمكن رؤية المتغيرات التي يستخدمها خارج هذه العملية. إذا كنت تريد مشاركة متغير مع برنامج نصي آخر يقوم البرنامج النصي الخاص بك بتشغيله، فيجب عليك تصدير هذا المتغير. سنوضح لك كيفية القيام بذلك باستخدام برنامجين نصيين.
أولاً، احفظ ما يلي باسم الملف script_one.sh
:
#!/bin/bashfirst_var=alphasecond_var=bravo# check their valuesecho "$0: first_var=$first_var, second_var=$second_var"export first_varexport second_var./script_two.sh# check their values againecho "$0: first_var=$first_var, second_var=$second_var"
وهذا يخلق متغيرين، first_var
و second_var
، ويقوم بتعيين بعض القيم. ويقوم بطباعتها في نافذة المحطة الطرفية، وتصدير المتغيرات، واستدعاء script_two.sh
. متى script_two.sh
تنتهي العملية، ويعود تدفق العملية إلى هذا البرنامج النصي، ويطبع المتغيرات مرة أخرى في نافذة المحطة الطرفية. بعد ذلك، يمكنك معرفة ما إذا كانت قد تغيرت.
النص الثاني الذي سنستخدمه هو script_two.sh
هذا هو النص الذي script_one.sh
المكالمات. اكتب ما يلي:
#!/bin/bash# check their valuesecho "$0: first_var=$first_var, second_var=$second_var"# set new valuesfirst_var=charliesecond_var=delta# check their values againecho "$0: first_var=$first_var, second_var=$second_var"
يقوم البرنامج النصي الثاني بطباعة قيم المتغيرين، وتعيين قيم جديدة لهما، ثم طباعتهما مرة أخرى.
لتشغيل هذه البرامج النصية، يجب عليك كتابة ما يلي لجعلها قابلة للتنفيذ:
chmod +x script_one.shchmod +x script_two.sh
والآن اكتب ما يلي لبدء التشغيل script_one.sh
:
./script_one.sh
وهذا ما يخبرنا به الناتج:
- ملف script_one.sh يطبع قيم المتغيرات، وهي ألفا وبرافو.
- ملف script_two.sh يطبع قيم المتغيرات (ألفا وبرافو) كما تلقاها.
- ملف script_two.sh يغيرهم إلى تشارلي ودلتا.
- ملف script_one.sh يطبع قيم المتغيرات، والتي لا تزال ألفا وبرافو.
ما يحدث في البرنامج النصي الثاني يظل في البرنامج النصي الثاني. الأمر أشبه بإرسال نسخ من المتغيرات إلى البرنامج النصي الثاني، ولكن يتم التخلص منها عند خروج البرنامج النصي. لا يتم تغيير المتغيرات الأصلية في البرنامج النصي الأول بأي شيء يحدث لنسخها في البرنامج النصي الثاني.
كيفية اقتباس المتغيرات
ربما لاحظت أنه عندما تشير البرامج النصية إلى المتغيرات، فإنها تكون بين علامتي اقتباس "
يتيح هذا إمكانية الرجوع إلى المتغيرات بشكل صحيح، بحيث يتم استخدام قيمها عند تنفيذ السطر في البرنامج النصي.
إذا كانت القيمة التي تعينها لمتغير ما تتضمن مسافات، فيجب وضعها بين علامتي اقتباس عند تعيينها للمتغير. وذلك لأن Bash يستخدم المسافة كفاصل بشكل افتراضي.
وهنا مثال:
site_name=How-To Geek
يرى Bash المساحة قبل “Geek” كإشارة إلى بدء أمر جديد. ويذكر أنه لا يوجد أمر من هذا القبيل، ويتخلى عن السطر. echo
يظهر لنا أن site_name
لا يحتوي المتغير على أي شيء – حتى نص “كيفية القيام بذلك”.
حاول ذلك مرة أخرى مع وضع علامات الاقتباس حول القيمة، كما هو موضح أدناه:
site_name="How-To Geek"
هذه المرة، تم التعرف عليها كقيمة واحدة وتم تعيينها بشكل صحيح إلى site_name
عامل.
الصدى هو صديقك
قد يستغرق الأمر بعض الوقت للتعود على استبدال الأوامر، واقتباس المتغيرات، وتذكر متى يجب تضمين علامة الدولار.
قبل أن تضغط على Enter وتنفذ سطرًا من أوامر Bash، جرّب ذلك باستخدام echo
أمامه. بهذه الطريقة، يمكنك التأكد من أن ما سيحدث هو ما تريده. يمكنك أيضًا اكتشاف أي أخطاء ربما ارتكبتها في بناء الجملة.