ارزیابی محاسباتی
BASH دارای چند روش مختلف است، برای آنکه به او بگوییم، به جای عملیات روی رشتهها، میخواهیم ارزیابی محاسباتی انجام بدهیم. اجازه دهید یکی یکی به آنها بپردازیم.
اولین روش دستور let میباشد:
$ unset a; a=4+5
$ echo $a
4+5
$ let a=4+5
$ echo $a
9
اگر عبارت را نقلقولی کنید، میتوانید از فاصلهها، پرانتزها و غیره استفاده کنید:
$ let a=\'(5+2)*3\'
برای لیست کامل عملگرهای معتبر، دستور help let یا مستندات را ببینید.
بعد دستور مرکب ارزیابی محاسباتی حقیقی است:
$ ((a=(5+2)*3))
این معادل دستور let میباشد، اما میتوانیم آن را به عنوان یک فرمان نیز به کار ببریم، به عنوان مثال در یک جمله if به این صورت:
$ if (($a == 21)); then echo \'Blackjack!\'; fi
عملگرهایی مانند == و < , > و غیره موجب انجام یک مقایسه در درون ارزیابی محاسباتی میشوند. اگر مقایسه صحیح باشد( به طور نمونه 10 > 2 در محاسبه صحیح است -- اما در رشتهها خیر!) ، بعد دستور مرکب با کد وضعیت 0 خارج میشود. اگر مقایسه غلط باشد با کد وضعیت 1 خارج میگردد. این امر آن را برای انجام بررسیها در یک اسکریپت سودمند میسازد.
هرچند اگر یک دستور مرکب نباشد، یک ترکیب دستوری معتبر جایگزینی حسابی (یا یک عبارت حسابی) نیز میباشد:
$ echo "There are $(($rows * $columns)) cells"
بخش درونی $((...)) یک مفهوم محاسباتی است، درست مانند ((...))، این به معنای آنست که به جای دستکاری رشتهها(الحاق row$، فاصله، ستاره، فاصله، و columns$)، میخواهیم محاسبه انجام بدهیم(عملیات چندگانه). ترکیب $((...)) همچنین قابل حمل به شل POSIX میباشد، در حالیکه ((...)) نیست.
خوانندگانی که با زبان برنامهنویسی C آشنا هستند، ممکن است مایل باشند بدانند که ((...)) ویژگیهای C-شکل بسیاری دارد. از میان آنها یکی عملگر سهگانه است:
$ ((abs = (a >= 0) ? a : -a))
و یکی هم استفاده از مقدار صحیح به عنوان مقدار درست:
$ if ((flag)); then echo "uh oh, our flag is up"; fi
توجه نمایید که ما متغیرها را در داخل ((...)) بدون پیشوند کردن علامت $ به آنها، استفاده کردهایم. این یک ترکیب خاص کوتاه شده است که BASH در درون ارزیابی محاسباتی و عبارتهای محاسباتی اجازه میدهد. همچنین میتوانیم آنرا درون یک $((...)) در BASH به کار ببریم، اما در شل POSIX خیر.
یک مطلب نهایی وجود دارد ، که باید در باره ((flag)) متذکر شویم. چون درون عبارت ((...)) قالب C-مانند دارد، یک متغیر( یا عبارت) که صفر ارزیابی گردد، به واسطه مفاهیم ارزیابی محاسباتی به عنوان false در نظر گرفته میشود. سپس، چون ارزیابی، غلط است، با کد وضعیت 1 خارج میشود. علاوه بر این، اگر عبارت درون ((...)) غیر صفر باشد، به عنوان صحیح در نظر گرفته میشود، و نظر به اینکه، ارزیابی صحیح است با کد وضعیت صفر خارج خواهد شد. این امر به طور بالقوه بسیار گیجکننده است، حتی برای اهل فن، به طوری که وقت زیادی برای پرداختن به آن از شما خواهد گرفت. با وجود این، موقعی که مسائل به طریقی که برای آنها در نظر گرفته شدهاند به کار بروند، در نهایت قابل درک خواهند بود:
$ flag=0 # no error
$ while read line; do
> if [[ $line = *err* ]]; then flag=1; fi
> done < inputfile
$ if ((flag)); then echo "oh no"; fi
ادامه دارد...