الفرق بين المراجعتين لصفحة: «Bash/operations on variables»
أسامه-دمراني (نقاش | مساهمات) إدخال 2.1 حذف سطر فارغ |
|||
سطر 126: | سطر 126: | ||
* [[Bash/aliases|الأوامر البديلة في Bash]]. | * [[Bash/aliases|الأوامر البديلة في Bash]]. | ||
* [[Bash/more advanced if usage|الاستخدامات المتقدمة لعبارة if الشرطية في Bash]]. | * [[Bash/more advanced if usage|الاستخدامات المتقدمة لعبارة if الشرطية في Bash]]. | ||
* [[مطابقة الأنماط باستخدام ميزات Bash]]. | * [[Bash/pattern matching using Bash features|مطابقة الأنماط باستخدام ميزات Bash]]. | ||
== مصادر == | == مصادر == |
مراجعة 07:20، 5 سبتمبر 2018
العمليات الحسابية على المتغيرات
ناقشنا العمليات الحسابية من قبل في التوسعات في 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
للمزيد من الشرح.
انظر أيضًا
- التوسعات في Bash.
- الأوامر البديلة في Bash.
- الاستخدامات المتقدمة لعبارة if الشرطية في Bash.
- مطابقة الأنماط باستخدام ميزات Bash.