قبلاً در بخشی به نام«عبارت حسابی» در این مورد صحبت نمودیم.
استفاده ترکیب دستوری ${#VAR
} تعداد کاراکترها در یک متغیر را محاسبه خواهد نمود. اگر VAR
برابر “*” یا “@” باشد، این کمیت به طور معمول با تعداد پارامترهای موضعی یا تعداد اعضاء یک آرایه جایگزین میشود. این مطلب در مثال زیر نمایش داده شده:
[bob in ~]
echo$SHELL
/bin/bash[bob in ~]
echo${#SHELL}
9[bob in ~]
ARRAY
=(seven two five)
[bob in ~]
echo${#ARRAY[*]}
3
${
VAR
:-WORD
}
اگر VAR
تعیین نشده یا تهی باشد، بسط WORD
جایگزین میگردد، در غیر آنصورت مقدار VAR
جایگزین میشود:
[bob in ~]
echo${TEST:-test}
test[bob in ~]
echo$TEST
[bob in ~]
exportTEST
=a_string
[bob in ~]
echo${TEST:-test}
a_string[bob in ~]
echo${TEST2:-$TEST}
a_string
این ترکیب اغلب در بررسیهای شرطی به کار میرود، به عنوان نمونه در این یکی:
[ -z "${COLUMNS:-}" ]
&& COLUMNS
=80
ترکیب کوتاهتری برای مورد زیر است:
if [ -z "${COLUMNS:-}" ]
; then
COLUMNS
=80
fi
برای اطلاعات بیشتر در مورد این نوع بررسی شرط بخشی تحت عنوان«مقایسه رشتهها» را ملاحظه کنید.
اگر خطتیره (-)با علامت مساوی (=)تعویض شود، کمیت به پارامتر تخصیص مییابد:
[bob in ~]
echo$TEST2
[bob in ~]
echo${TEST2:=$TEST}
a_string[bob in ~]
echo$TEST2
a_string
ترکیب دستوری زیر وجود یک متغیر را بررسی میکند. اگر ایجاد نشده باشد، بسط WORD
در خروجی استاندارد چاپ میشود و شلهای غیرمحاورهای خارج میشوند. یک نمونه مشروح:
[bob in ~]
catvartest.sh
#!/bin/bash # This script tests whether a variable is set. If not, # it exits printing a message. 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...[bob in testdir]
exportTESTVAR
=present
[bob in testdir]
./vartest.sh present TESTVAR is set, we can proceed.
استفاده از «+» به جای علامت تعجب متغیر را برابر با بسط WORD
قرار میدهد، اگر وجود نداشته باشد هیچ اتفاقی رخ نمیدهد.
برای رها کردن کاراکترهایی به تعداد OFFSET
، از یک متغیر، ترکیب زیر را بهکار ببرید:
${
VAR
:OFFSET
:LENGTH
}
پارامتر LENGTH
تعیین میکند که چند کاراکتر نگه داشته شود، شروع از اولین کاراکتر پس از نقطه offset میباشد. اگر LENGTH
حذف شود، باقیمانده محتوای متغیرگرفته میشود:
[bob in ~]
exportSTRING
="thisisaverylongname"
[bob in ~]
echo${STRING:4}
isaverylongname[bob in ~]
echo${STRING:6:5}
avery
${
و VAR
#WORD
}${
VAR
##WORD
}
این ساختارها برای حذف یک الگوی منطبق بر بسط WORD
در VAR
به کار میروند. WORD
برای تولید یک الگو فقط به عنوان بسط نام فایل، بسط داده میشود. اگر الگو بر ابتدای مقداربسط یافته VAR
منطبق شود، آنوقت نتیجه بسط، مقدار بسط یافته VAR
با کوتاهترین الگوی انطباق است(«#») یا بلندترین الگوی انطباق (نشان داده شده با «##»).
اگر VAR
کاراکتر *
یا @
باشد، عملیات حذف الگوروی هر پارامتر موضعی به ترتیب اعمال میشود، و بسط لیست منتجه خواهد بود.
اگر VAR
یک متغیر آرایهای با شاخص «*» یا «@» باشد، عملیات حذف الگو بر هر یک از اعضای آرایه به ترتیب اعمال میگردد، و بسط لیست منتجه خواهد بود. این مطلب در مثال زیر نمایش داده شده است:
[bob in ~]
echo${ARRAY[*]}
one two one three one four[bob in ~]
echo${ARRAY[*]#one}
two three four[bob in ~]
echo${ARRAY[*]#t}
one wo one hree one four[bob in ~]
echo${ARRAY[*]#t*}
one wo one hree one four[bob in ~]
echo${ARRAY[*]##t*}
one one one four
نتیجه متضادی با استفاده از «%» و «%%» حاصل میشود، چنانکه در مثال زیر. WORD
با یک بخش دنباله رشته منطبق میشود:
[bob in ~]
echo$STRING
thisisaverylongname[bob in ~]
echo${STRING%name}
thisisaverylong
این کار بااستفاده از ترکیبهای
${
VAR
/PATTERN
/STRING
}
یا
${
VAR
//PATTERN
/STRING
}
انجام میشود. ترکیب اول فقط اولین انطباق و دومی تمام انطباقهای PATTERN
را با STRING
تعویض مینماید:
[bob in ~]
echo${STRING/name/string}
thisisaverylongstring
اطلاعات بیشتری میتوانید در صفحههای infoی Bashبیابید.