در یک اسکریپت،عملیات به ترتیب اولویت انجام میشوند: عملیات دارای تقدم بالاتر، قبل از آنها که اولویت پایینتری دارند، انجام میشوند. [1]
جدول 8-1. اولویت عملگر
عملگر | معنی | توضیحات |
---|---|---|
بالاترین اولویت | ||
var++ var-- | پس افزایش، پس کاهش | عملگرهای سبکِ C |
++var --var | پیش افزایش، پیش کاهش | |
! ~ | نفی | منطقی - بیتی، معنی عملگر پس از خود را برعکس میسازد |
** | توان رساندن | عملیات حسابی |
% / * | ضرب، تقسیم، باقیمانده | عملیات حسابی |
+ - | تفریق، جمع | عملیات حسابی |
<< >> | انتقال به راست و چپ | بیتی |
-z -n | مقایسه یگانی | رشته هست/نیست null |
-e -f -t -x, etc. | مقایسه یگانی | تست-فایل |
< -lt > -gt <= -le >= -ge | مقایسه مرکب | رشته و عدد صحیح |
-nt -ot -ef | مقایسه مرکب | تست-فایل |
== -eq != -ne | برابری / نابرابری | عملگرهای بررسی رشته و عدد صحیح |
& | AND | بیتی |
^ | XOR | OR بیتیانحصاری |
| | OR | بیتی |
&& -a | and | مقایسه مرکب، منطقی |
|| -o | or | مقایسه مرکب، منطقی |
?: | عملگر سهگانه | سبکِ C |
= | تخصیص | (با عملگر برابری test اشتباه نکنید) |
*= /= %= += -= <<= >>= &= | تخصیص ترکیبی | مساوی-ضربدر، مساوی-تقسیمبر، مساوی-باقیمانده، و غیره. |
, | comma | تعدادی عملگر را بهم پیوند میدهد |
پایینترین اولویت |
در عمل، تمام آنچه واقعاً لازم است شما به خاطر بسپارید، از این قرار است:
آهنگ "My Dear Aunt Sally" (multiply, divide, add, subtract) برای عملیات حساب خودمان.
عملگرهای منطقی مرکب، &&، ||، -a، و -o دارای اولویت پایین هستند.
ترتیب ارزیابی عملگرهای دارای اولویت برابر، به طور معمول از چپ به راست است.
اکنون، بیایید از آگاهی خودمان در مورد تقدم عملگر برای تحلیل دو سطر از فایل /etc/init.d/functions ، به طوریکه در توزیع لینوکس Fedora Core یافت میشود، بهرهبرداری کنیم.
while [ -n "$remaining" -a "$retry" -gt 0 ]; do # # while [ -n "$remaining" -a "$retry" -gt 0 ]; do # # #+ #+ #+ #+ # # #+ #+ # if [ -f /etc/sysconfig/i18n -a -z "${NOLOCALE:-}" ] ; then # if [ -f /etc/sysconfig/i18n -a -z "${NOLOCALE:-}" ] ; then # # #+ #+ #+ #+ # # #+ # # # # #
برای پرهیز از آشفتگی یا خطا در یک رشته پیچیده ازعملگرهای تست، رشته را به بخشهایی که داخل براکتها قرار داده میشوند تجزیه کنید. if [ "$v1" -gt "$v2" -o "$v1" -lt "$v2" -a -e "$filename" ] # if [[ "$v1" -gt "$v2" ]] || [[ "$v1" -lt "$v2" ]] && [[ -e "$filename" ]] # |
[1] |
اولویت، در این مضمون، تقریباً دارای همان معنای حق تقدم است. |