الفرق بين المراجعتين لصفحة: «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
للمزيد من الشرح.
انظر أيضًا
- التوسعات في Bash.
- الأوامر البديلة في Bash.
- الاستخدامات المتقدمة لعبارة if الشرطية في Bash.
- مطابقة الأنماط باستخدام ميزات Bash.