الفرق بين المراجعتين ل"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.