expr
نمیخواستم اینجا توضیح برنامه بنویسم ولی چون این برنامهی معروفی میگم:
expr برنامهای هست که جواب یک عبارت رو حساب میکنه
کارهایی که میکنه مختلفه مثل and و or و بزرگتر و کوچکتری و substring و regexp matching و ...
ولی چیزی که همه جا نوشته میشه! arithmetic operations (من که مترجم نیستم! عملیات حسابی) هست
arman:~$ expr 4 + 6
10
arman:~$ expr 3 / 2
1
arman:~$ expr 9 - 5
4
arman:~$ expr 8 \* 3
24
همونطور که دیدن دو تا نکته هست:
* باید بین عملگر و عملوند فاصله باشه
* عملگر ضرب باید escape بشه که با * All Files قاطی نشه
عملیات حسابی
برای حساب کردن یک عبارت حسابی به جاری استفاده از expr بهتره که از خود shell استفاده کنیم. برای این کار عبارت را به صورت ((exp))$ مینویسیم:
arman:~$ echo $((2+5*3-10/2))
12
arman:~$ echo $((2#100))
4
دستور دوم تبدیل مبنا هستش
از expr بهتره مگه نه؟ ولی نمیدونم چرا ناشناس باقی مونده
Command Substitution (واقعا منو از ترجمهي این معاف کنید!)
بعضی وقتها میخوایم مقدار متغییرها رو برابر خروجی یک برنامه قرار بدیم مثلا میخوایم اسم فایلهای یک دایرکتوری رو توی یک متغییر بریزیم اون وقت باید دستور رو در ()$ قرار بدیم
راه دیگه که معمولتر هم هست قرار دادن دستور بین دو تا ` است (backquoting)
arman:~$ a=$(ls /) or a=`ls /`
arman:~$ echo $a
bin boot cdrom dev etc home initrd initrd.img lib lost+found media mnt opt proc root sbin srv sys tmp usr var vmlinuz
بسط پارامترها (Parameter Expansion)
وقتی میخواهیم مقدار یک پارامتر (متغییر) رو بدونیم باید بصورت
${parameter}
بنویسیم البته {} اختیاری هستند به جز وقتی که پارامترهای عددی بیشتر از یک رقمی داریم یا در بعد از پارامتر کاراکتری وجود دارد که ممکن است جز نام پارامترمحسوب شود
خوب اینها رو که بلد بودیم قسمت مهم اعمال بعضی تغییرها روی متغییرها هست
${parameter:-default}
مقدار parameter را برمیگرداند اگر parameter مقدار دهی نشده باشد یا null (خالی) باشد مقدار default را برمیگرداند
arman:~$ a=Value
arman:~$ echo ${a:-PARAMETER IS NOT SET}
Value
arman:~$ echo ${b:-PARAMETER IS NOT SET}
PARAMETER IS NOT SET
${parameter:=default}
مانند بالا ولی مقدار default به parameter اختصاص داده میشود
${parameter:?[message]}
* منظور از براکتها این است که قسمت message اختیاری است
مقدار parameter را برمیگرداند اگر parameter مقدار دهی نشده باشد یا null باشد، یک خطا اتفاق میافتد که message هم به عنوان پیام خطا نمایش داده میشود و با مقدار خروجی غیر صفر خواهد بود
arman:~$ echo ${test:?}
bash: test: parameter null or not set
arman:~$ echo ${test:?Please set test variable}
bash: test: Please set test variable
arman:~$ test='new value'
arman:~$ echo ${test:?Please set test variable}
new value
${parameter:+val}
اگر parameter مقدار دهی نشده یا null باشد مقدار val را برمیگرداند در غیر اینصورت همان null را برمیگرداند
در تمام مثال های بالا که از : در آنها استفاده شده میتوانیم : را پاک کنیم در اینصورت فقط مقدار دهی شدن مورد بررسی قرار داده میشود و null بودن تاثیری ندارد
arman:~$ test=
arman:~$ echo ${test:-is null or not set}
is null or not set
arman:~$ echo ${test-is not set}
arman:~$ unset test
arman:~$ echo ${test:-is null or not set}
is null or not set
arman:~$ echo ${test-is not set}
is not set
${#parameter}
طول رشتهی parameter را بر میگرداند
${parameter#pattern}
کوچکترین رشتهای که با الگوی pattern سازگارست از اول parameter پاک میکند
${parameter##pattern}
بزرگترین رشتهای که با الگوی pattern سازگارست از اول parameter پاک میکند
${parameter%pattern}
کوچکترین رشتهای که با الگوی pattern سازگارست از آخر parameter پاک میکند
${parameter%%pattern}
بزرگترین رشتهای که با الگوی pattern سازگارست از آخر parameter پاک میکند
arman:~$ a=000100
arman:~$ echo ${a#+(0)}
00100
arman:~$ echo ${a##+(0)}
100
arman:~$ echo ${a%+(0)}
00010
arman:~$ echo ${a%%+(0)}
0001
arman:~$ a=100
arman:~$ echo ${a##+(0)}
100