الفرق بين المراجعتين ل"Bash/operations on variables"

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث
(إدخال 1.0، عنوان الصفحة)
 
(مراجعة 6: إضافة تصانيف)
 
(5 مراجعات متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة)
سطر 1: سطر 1:
 
<noinclude>{{DISPLAYTITLE:العمليات على المتغيرات في Bash}}</noinclude>
 
<noinclude>{{DISPLAYTITLE:العمليات على المتغيرات في Bash}}</noinclude>
 +
== العمليات الحسابية على المتغيرات ==
 +
ناقشنا العمليات الحسابية من قبل في التوسعات في Bash، انظر [[Bash/shell expansion#.D8.A7.D9.84.D8.AA.D9.88.D8.B3.D8.B9 .D8.A7.D9.84.D8.AD.D8.B3.D8.A7.D8.A8.D9.8A|التوسع الحسابي.]]
 +
 +
== طول المتغير ==
 +
استخدم صيغة <code>{VAR#}$</code> لحساب عدد المحارف في متغير ما، وإن كان <code>VAR</code> هو أحد المحرفيْن <code>*</code> أو <code>@</code> فإن القيمة يحل محلها عدد المعامِلات الموضعية أو عدد العناصر داخل المصفوفة بشكل عام، انظر المثال التالي:<syntaxhighlight lang="bash">
 +
[hsoub in ~] echo $SHELL
 +
/bin/bash
 +
 +
[hsoub in ~] echo ${#SHELL}
 +
9
 +
 +
[hsoub in ~] ARRAY=(one two three)
 +
 +
[hsoub in ~] echo ${#ARRAY}
 +
3
 +
</syntaxhighlight>
 +
 +
== عمليات التحول في المتغيرات ==
 +
 +
=== الإحلال Substitution ===
 +
<code>{VAR:-WORD}$</code>
 +
 +
إن لم يُحدَّد <code>VAR</code> أو كان فارغًا فيحل محله توسع <code>WORD</code>، وإلا فإن قيمة <code>VAR</code> هي التي تحل محله:<syntaxhighlight lang="bash">
 +
[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
 +
</syntaxhighlight>تُستخدم تلك الصيغة في الاختبارات الشرطية مثل الاختبار التالي:<syntaxhighlight lang="bash">
 +
[ -z "${COLUMNS:-}" ] && COLUMNS=80
 +
 +
</syntaxhighlight>إذ هو صورة أقصر لهذا:<syntaxhighlight lang="bash">
 +
if [ -z "${COLUMNS:-}" ]; then
 +
COLUMNS=80
 +
fi
 +
</syntaxhighlight>انظر [[Bash/introduction to if#.D8.A7.D9.84.D9.85.D9.82.D8.A7.D8.B1.D9.86.D8.A7.D8.AA .D8.A7.D9.84.D9.86.D8.B5.D9.8A.D8.A9|المقارنات النصية]] في فصل مقدمة إلى <code>if</code>، للمزيد من التفصيل عن ذلك النوع من اختبار الشروط.
 +
 +
إن بدّلنا علامة التساوي <code>=</code> مكان الشرطة <code>-</code> فإن القيمة تعيَّن إلى المعامِل إن لم تكن موجودة:<syntaxhighlight lang="bash">
 +
[hsoub in ~] echo $TEST2
 +
 +
 +
[hsoub in ~] echo ${TEST2:=$TEST}
 +
a_string
 +
 +
[hsoub in ~] echo $TEST2
 +
a_string
 +
</syntaxhighlight>تختبر الشيفرة التالية وجود متغير ما، فإن كان غير مضبوط فإن توسع <code>WORD</code> يُطبع إلى مُخرج قياسي، وتُغلق الصدفات غير التفاعلية:<syntaxhighlight lang="bash">
 +
[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.
 +
</syntaxhighlight>استخدام محرف <code>+</code> بدلًا من <code>!</code> يضبط المتغير على توسع <code>WORD</code>، لكن إن لم يكن موجودًا فلا يحدث شيء.
 +
 +
=== حذف النصوص الفرعية Substrings ===
 +
استخدم البنية اللغوية التالية لتجريد متغير من عدد من محارفه تكافئ <code>OFFSET</code>:<syntaxhighlight lang="bash">
 +
${VAR:OFFSET:LENGTH}
 +
</syntaxhighlight>يُحدِّد معامل <code>LENGTH</code> عدد المحارف التي ستبقى بدءًا من أول محرف يلي نقطة التبديل (offset point)، أما إن أُهمل <code>LENGTH</code> فتؤخذ بقية محتويات المتغير:<syntaxhighlight lang="bash">
 +
[hsoub in ~] export STRING="thisisaverylongname"
 +
 +
[hsoub in ~] echo ${STRING:4}
 +
isaverylongname
 +
 +
[hsoub in ~] echo ${STRING:6:5}
 +
avery
 +
</syntaxhighlight>تُستخدم بُنى <code>{VAR#WORD}$</code> و <code>{VAR##WORD}$</code> لحذف الأنماط التي تطابق توسع <code>WORD</code> في <code>VAR</code>، ويتوسع <code>WORD</code> لينتج نمطًا كما في توسع اسم الملف، فإن طابق النمط بداية قيمة <code>VAR</code> الموسَّعة فتكون نتيجة التوسع هي قيمة <code>VAR</code> الموسعة مع أقصر نمط مطابِق ("<code>#</code>") أو أطول نمط مطابِق (موضح بـ "<code>##</code>").
 +
 +
إن كان <code>VAR</code> هو أحد المحرفيْن <code>*</code> أو <code>@</code> فتطبَّق عملية حذف النمط على كل معامِل موضعي بالترتيب، ويكون التوسع هو قائمة المحصلة (Resultant List). لكن إن كان VAR متغير مصفوفة (array variable) مصحوب بأحد المحرفيْن <code>*</code> أو <code>@</code> فتطبَّق عملية حذف النمط على كل عنصر في المصفوفة بالترتيب، ويككون التوسع هو قائمة المحصلة، انظر المثال التالي:<syntaxhighlight lang="bash">
 +
[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
 +
</syntaxhighlight>يمكن الحصول على التأثير المضاد لهذا باستخدام <code>%</code> و <code>%%</code> ، كما في المثال التالي، يجب أن يطابِق <code>WORD</code> جزءًا من نهاية النص:<syntaxhighlight lang="bash">
 +
[hsoub in ~] echo $STRING
 +
thisisaverylongname
 +
 +
[hsoub in ~] echo ${STRING%name}
 +
thisisaverylong
 +
</syntaxhighlight>
 +
 +
=== استبدال أجزاء من أسماء المتغيرات ===
 +
يمكن استبدال أجزاء من اسم متغير باستخدام إحدى البُنى اللغوية التالية:<syntaxhighlight lang="bash">
 +
${VAR/PATTERN/STRING}
 +
 +
أو
 +
 +
${VAR//PATTERN/STRING}
 +
 +
</syntaxhighlight>تستبدل الصيغة الأولى أول تطابق فقط، أما الثانية فتستبدل كل تطابقات <code>PATTERN</code> مع <code>STRING</code>، انظر المثال التالي:<syntaxhighlight lang="bash">
 +
[hsoub in ~] echo ${STRING/name/string}
 +
thisisaverylongstring
 +
</syntaxhighlight>انظر صفحات دليل <code>info</code> للمزيد من الشرح.
 +
 +
== انظر أيضًا ==
 +
* [[Bash/shell expansion|التوسعات في Bash]].
 +
* [[Bash/aliases|الأوامر البديلة في Bash]].
 +
* [[Bash/more advanced if usage|الاستخدامات المتقدمة لعبارة if الشرطية في Bash]].
 +
* [[Bash/pattern matching using Bash features|مطابقة الأنماط باستخدام ميزات Bash]].
 +
 +
== مصادر ==
 +
* <span> </span>[http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_10_03.html دليل Bash للمبتدئين، صفحة العمليات على المتغيرات في Bash.]
 +
[[تصنيف:Bash]]
 +
[[تصنيف:Bash Operation On Variables]]
 +
[[تصنيف:Bash Variables]]
 +
[[تصنيف:Bash Expansion]]
 +
[[تصنيف:Bash Array Variables]]

المراجعة الحالية بتاريخ 00:50، 7 سبتمبر 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 للمزيد من الشرح.

انظر أيضًا

مصادر