العمليات على المتغيرات في Bash

من موسوعة حسوب
اذهب إلى: تصفح، ابحث

العمليات الحسابية على المتغيرات

ناقشنا العمليات الحسابية من قبل في التوسعات في Bash، انظر التوسع الحسابي.

طول المتغير

استخدم صيغة {VAR#}$ لحساب عدد المحارف في متغير ما، وإن كان VAR هو أحد المحرفيْن * أو @ فإن القيمة يحل محلها عدد المعامِلات الموضعية أو عدد العناصر داخل المصفوفة بشكل عام، انظر المثال التالي:
[hsoub in ~] echo $SHELL
/bin/bash

[hsoub in ~] echo ${#SHELL}
9

[hsoub in ~] ARRAY=(one two three)

[hsoub in ~] echo ${#ARRAY}
3

عمليات التحول في المتغيرات

الإحلال Substitution

{VAR:-WORD}$

إن لم يُحدَّد VAR أو كان فارغًا فيحل محله توسع WORD، وإلا فإن قيمة VAR هي التي تحل محله:
[hsoub in ~] echo ${TEST:-test}
test

[hsoub in ~] echo $TEST
 

[hsoub in ~] export TEST=a_string

[hsoub in ~] echo ${TEST:-test}
a_string

[hsoub in ~] echo ${TEST2:-$TEST}
a_string
تُستخدم تلك الصيغة في الاختبارات الشرطية مثل الاختبار التالي:
[ -z "${COLUMNS:-}" ] && COLUMNS=80
إذ هو صورة أقصر لهذا:
if [ -z "${COLUMNS:-}" ]; then
	COLUMNS=80
fi
انظر المقارنات النصية في فصل مقدمة إلى if، للمزيد من التفصيل عن ذلك النوع من اختبار الشروط. إن بدّلنا علامة التساوي = مكان الشرطة - فإن القيمة تعيَّن إلى المعامِل إن لم تكن موجودة:
[hsoub in ~] echo $TEST2


[hsoub in ~] echo ${TEST2:=$TEST}
a_string

[hsoub in ~] echo $TEST2
a_string
تختبر الشيفرة التالية وجود متغير ما، فإن كان غير مضبوط فإن توسع WORD يُطبع إلى مُخرج قياسي، وتُغلق الصدفات غير التفاعلية:
[hsoub in ~] cat vartest.sh
#!/bin/bash
 
# يتأكد هذا البرنامج إن كان المتغير مضبوطًا على قيمة ما، فإن لم يكن فإن البرنامج يُغلَق ويطبع رسالة.
 
echo ${TESTVAR:?"There's so much I still wanted to do..."}
echo "TESTVAR is set, we can proceed."

[bob in testdir] ./vartest.sh
./vartest.sh: line 6: TESTVAR: There's so much I still wanted to do...

[hsoub in testdir] export TESTVAR=present

[hsoub in testdir] ./vartest.sh
present
TESTVAR is set, we can proceed.
استخدام محرف + بدلًا من ! يضبط المتغير على توسع WORD، لكن إن لم يكن موجودًا فلا يحدث شيء.

حذف النصوص الفرعية Substrings

استخدم البنية اللغوية التالية لتجريد متغير من عدد من محارفه تكافئ OFFSET:
${VAR:OFFSET:LENGTH}
يُحدِّد معامل LENGTH عدد المحارف التي ستبقى بدءًا من أول محرف يلي نقطة التبديل (offset point)، أما إن أُهمل LENGTH فتؤخذ بقية محتويات المتغير:
[hsoub in ~] export STRING="thisisaverylongname"

[hsoub in ~] echo ${STRING:4}
isaverylongname

[hsoub in ~] echo ${STRING:6:5}
avery
تُستخدم بُنى {VAR#WORD}$ و {VAR##WORD}$ لحذف الأنماط التي تطابق توسع WORD في VAR، ويتوسع WORD لينتج نمطًا كما في توسع اسم الملف، فإن طابق النمط بداية قيمة VAR الموسَّعة فتكون نتيجة التوسع هي قيمة VAR الموسعة مع أقصر نمط مطابِق ("#") أو أطول نمط مطابِق (موضح بـ "##"). إن كان VAR هو أحد المحرفيْن * أو @ فتطبَّق عملية حذف النمط على كل معامِل موضعي بالترتيب، ويكون التوسع هو قائمة المحصلة (Resultant List). لكن إن كان VAR متغير مصفوفة (array variable) مصحوب بأحد المحرفيْن * أو @ فتطبَّق عملية حذف النمط على كل عنصر في المصفوفة بالترتيب، ويككون التوسع هو قائمة المحصلة، انظر المثال التالي:
[hsoub in ~] echo ${ARRAY[*]}
one two one three one four

[hsoub in ~] echo ${ARRAY[*]#one}
two three four

[hsoub in ~] echo ${ARRAY[*]#t}
one wo one hree one four

[hsoub in ~] echo ${ARRAY[*]#t*}
one wo one hree one four

[hsoub in ~] echo ${ARRAY[*]##t*}
one one one four
يمكن الحصول على التأثير المضاد لهذا باستخدام % و %% ، كما في المثال التالي، يجب أن يطابِق WORD جزءًا من نهاية النص:
[hsoub in ~] echo $STRING
thisisaverylongname

[hsoub in ~] echo ${STRING%name}
thisisaverylong

استبدال أجزاء من أسماء المتغيرات

يمكن استبدال أجزاء من اسم متغير باستخدام إحدى البُنى اللغوية التالية:
${VAR/PATTERN/STRING}

أو

${VAR//PATTERN/STRING}
تستبدل الصيغة الأولى أول تطابق فقط، أما الثانية فتستبدل كل تطابقات PATTERN مع STRING، انظر المثال التالي:
[hsoub in ~] echo ${STRING/name/string}
thisisaverylongstring
انظر صفحات دليل info للمزيد من الشرح.

انظر أيضًا

مصادر