المتغيرات والثوابت وتعويض الأوامر في سكربتات الصدفة (Shell Scripts)
تُعدُّ سكربتات الصدفة أو الـ “Shell Scripts” جزءًا أساسيًا من بيئة أنظمة التشغيل على غرار لينكس ويوينكس، حيث تتيح للمستخدمين إمكانية أتمتة المهام وتنفيذها بشكل سلس ومتسلسل. في هذا المقال، سنستعرض كيفية التعامل مع المتغيرات والثوابت، بالإضافة إلى كيفية تعويض الأوامر (Command Substitution) في سكربتات الصدفة، وهي أدوات قوية تساهم في تطوير سكربتات أكثر كفاءة ومرونة.
أولاً: المتغيرات في سكربتات الصدفة
المتغيرات هي قيمة تُخزّن في الذاكرة وتُستخدم أثناء تنفيذ السكربت. يمكن للمتغيرات في سكربتات الصدفة أن تحتوي على نصوص، أرقام، أو حتى قيم منطقية. يتم استخدامها لتخزين المعلومات وتبادلها بين الأوامر داخل السكربت.
تعريف المتغيرات
لتعريف متغير في سكربت الصدفة، يجب ببساطة تحديد اسم المتغير والقيمة التي سيتم تخزينها في المتغير دون الحاجة إلى استخدام علامات “=” أو أي نوع من الفواصل بين الأجزاء. على سبيل المثال:
bashname="John"
age=25
هنا، قمنا بتخزين اسم “John” في المتغير name، والعمر 25 في المتغير age. تُعتبر هذه المتغيرات مفيدة لتخزين البيانات التي يحتاج السكربت إليها.
استخدام المتغيرات
لاسترجاع قيمة المتغيرات في سكربتات الصدفة، نستخدم الـ “دولار” ($) أمام اسم المتغير. على سبيل المثال، لطباعة محتوى المتغير name:
bashecho $name
سيطبع هذا الأمر “John”، أي القيمة المخزنة في المتغير name.
المتغيرات المحلية والعالمية
في سكربتات الصدفة، يمكن أن تكون المتغيرات محلية أو عالمية. المتغيرات المحلية هي التي يتم تعريفها داخل دالة معينة أو سكربت صغير، بينما المتغيرات العالمية يمكن الوصول إليها من أي مكان في السكربت أو النظام. لتحديد متغير محلي داخل دالة، يمكننا استخدام الكلمة المحجوزة local:
bashmy_function() {
local city="Paris"
echo $city
}
هنا، سيظل المتغير city محليًا داخل الدالة ولن يكون متاحًا خارجها.
ثانياً: الثوابت في سكربتات الصدفة
الثوابت هي قيم ثابتة لا يمكن تغييرها بعد تعريفها. في بيئة سكربتات الصدفة، لا يوجد مفهوم رسمي للثوابت كما هو الحال في لغات البرمجة الأخرى مثل C أو Python. ولكن يمكن محاكاة الثوابت عن طريق تحديد متغير لا يمكن تغيير قيمته في السكربت.
لتحديد ثابت، يمكن أن نستخدم عادةً اسم متغير مكتوب بأحرف كبيرة (وهو مجرد اصطلاح، وليس فرضًا من النظام)، كما يمكننا جعل المتغير غير قابل للتغيير باستخدام خاصية readonly:
bashreadonly PI=3.14159
هنا، قمنا بتحديد ثابت PI ولن يمكن تغيير قيمته بعد تعيينها.
ثالثاً: تعويض الأوامر في سكربتات الصدفة
تعويض الأوامر أو الـ “Command Substitution” هي عملية استبدال الأمر بالنتيجة التي يُنتجها هذا الأمر. هذه التقنية تسمح بإدراج النتائج الناتجة عن أوامر معينة داخل سكربتات الصدفة، ما يساعد في أتمتة وإدارة البيانات.
الطريقة الأساسية لتعويض الأوامر
يمكن استخدام تعويض الأوامر في سكربتات الصدفة باستخدام القوسين العكسيين “ (backticks) أو باستخدام الطريقة الحديثة $(). على سبيل المثال:
bashcurrent_date=`date`
echo "Today's date is: $current_date"
أو باستخدام الطريقة الحديثة:
bashcurrent_date=$(date)
echo "Today's date is: $current_date"
في هذا المثال، يتم تنفيذ أمر date لاسترجاع التاريخ الحالي، ومن ثم يتم تخزين النتيجة في المتغير current_date ليتم استخدامها لاحقًا في السكربت.
استخدام تعويض الأوامر في الأوامر المركبة
يمكنك دمج تعويض الأوامر في أوامر أخرى لتحقيق مهام معقدة. على سبيل المثال، إذا أردت معرفة عدد الملفات في دليل معين:
bashfile_count=$(ls | wc -l)
echo "Number of files: $file_count"
هنا، يقوم أمر ls بإدراج الملفات في الدليل، وأمر wc -l يحسب عدد الأسطر (التي تمثل عدد الملفات). النتيجة النهائية تُخزن في المتغير file_count.
استخدام تعويض الأوامر داخل حلقات
يمكنك أيضًا استخدام تعويض الأوامر داخل الحلقات أو البنى الشرطية. على سبيل المثال:
bashfor file in $(ls *.txt); do
echo "Processing file: $file"
done
في هذا المثال، يتم الحصول على قائمة من الملفات ذات الامتداد .txt باستخدام تعويض الأوامر، ثم يتم المرور على كل ملف في هذه القائمة داخل حلقة for.
رابعاً: المتغيرات الخاصة في سكربتات الصدفة
توجد عدة متغيرات خاصة يمكن استخدامها داخل سكربتات الصدفة لتسهيل البرمجة. بعض هذه المتغيرات يتم توفيرها من قبل الـ Shell بشكل افتراضي.
"$?" – حالة الخروج (Exit Status)
يتم تخزين حالة الخروج الخاصة بالعملية الأخيرة في المتغير $?. تُستخدم حالة الخروج لمعرفة ما إذا كانت العملية قد نجحت أو فشلت:
bashecho "Hello, World!"
if [ $? -eq 0 ]; then
echo "Command executed successfully"
else
echo "Command failed"
fi
في هذا المثال، بعد تنفيذ أمر echo, إذا كانت حالة الخروج 0 (التي تعني النجاح)، سيتم طباعة “Command executed successfully”.
"$@" و "$*" – وسيطات السكربت
عند تمرير وسيطات (معاملات) إلى سكربت الصدفة، يمكن استخدام المتغيرات "$@" و "$*" للتعامل مع هذه الوسيطات. الفرق بينهما هو أن "$@" يضع كل وسيطة في عنصر منفصل عند استخدامها في حلقة، بينما "$*" يعامل جميع الوسائط كقيمة واحدة مفصولة بمسافات.
bashecho "All arguments using \"\$*\": $*"
echo "All arguments using \"\$@\": $@"
$$ – معرّف العملية (Process ID)
يتم تخزين معرّف العملية (PID) الخاص بالسكربت الجاري تنفيذه في المتغير $$. يمكن استخدامه لأغراض مثل إدارة العمليات:
bashecho "The process ID of this script is $$"
خامساً: العمل مع بيئة الـ Shell
تتفاعل سكربتات الصدفة مع البيئة التي تعمل فيها. على سبيل المثال، إذا كان السكربت يعمل في بيئة معينة مثل /bin/bash، يتم تحميل بعض المتغيرات تلقائيًا. بعض المتغيرات البيئية الشهيرة تشمل:
-
HOME: يحتوي على المسار إلى دليل المستخدم. -
PATH: يحتوي على قائمة الدلائل التي يتم البحث فيها عن الأوامر. -
USER: يحتوي على اسم المستخدم الذي يقوم بتشغيل السكربت.
يمكنك الوصول إلى هذه المتغيرات واستخدامها داخل السكربتات:
bashecho "Your home directory is $HOME"
سادساً: التعامل مع الأخطاء في سكربتات الصدفة
تعد معالجة الأخطاء جزءًا هامًا من أي سكربت. يمكن أن يحدث خطأ في أي نقطة من السكربت، لذلك من المهم معرفة كيف نتعامل مع الأخطاء. يستخدم معظم المطورين الأوامر الشرطية مثل if للتحقق من حالة الخروج:
bashcp file1.txt /backup/
if [ $? -ne 0 ]; then
echo "Error copying file!"
fi
الخاتمة
تُعدُّ المتغيرات، الثوابت، وتعويض الأوامر من الركائز الأساسية التي يبنى عليها سكربتات الصدفة. من خلال استخدامها بفعالية، يمكن للمطورين تحسين الكفاءة، والمرونة، وإدارة الأوامر في بيئة العمل. يتمثل الهدف الرئيسي من تعلم هذه الأساسيات في تسهيل أتمتة العمليات المختلفة على الأنظمة، مما يوفر الوقت والجهد.

