فصل 8. عملکردها و مباحث مربوط

‎8.4‎- اولویت عملگر

در یک اسکریپت،عملیات به ترتیب اولویت انجام می‌شوند: عملیات دارای تقدم بالاتر، قبل از آنها که اولویت پایین‌تری دارند، انجام می‌شوند. [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)‏ برای عملیات حساب خودمان.(مترجم: روشی برای به خاطر سپردن فهرستی از اقلام است. در اینجا برای به خاطر سپردن ترتیب اولویت عملگرها، ارتباطی میان حروف اول نام عملگرها و موقعیت کلماتی درعنوان آهنگ که با همان حرف شروع می‌شوند برقرار گردیده است. به عنوان مثال عملگر divide با کلمه Dear که هردو با حرف d شروع می‌شوند و در جایگاه دوم قرار دارند.)

  • عملگرهای منطقی مرکب، &&‏، ||‏، ‎-a‎، و ‎-o‎ دارای اولویت پایین هستند.

  • ترتیب ارزیابی عملگرهای دارای اولویت برابر، به طور معمول از چپ به راست است.

اکنون، بیایید از آگاهی خودمان در مورد تقدم عملگر برای تحلیل دو سطر از فایل ‎/etc/init.d/functions‎ ، به طوریکه در توزیع لینوکس Fedora Core یافت می‌شود، بهره‌برداری کنیم.

while [ -n "$remaining" -a "$retry" -gt 0 ]; do

# این در نگاه اول تا اندازه‌‌ای هراس‌آور به نظر می‌رسد‎


#                            :جدا کردن شرط ها‎
while [ -n "$remaining" -a "$retry" -gt 0 ]; do
#       --condition 1-- ^^ --condition 2-

#         صفر باشد ‎‎"$remaining"‎ اگر طول متغیر‎‎
#+                  ‎(-a)‎ و‎
#+   بزرگتر از صفر باشد، آنوقت ‎"$retry"‎ متغیر‎
#+ را برگشت ‎(0)‎ موفقیت ‎[‎ عبارت داخل براکت‌ها ‎]‎
#+ .یک تکرار را اجرا می‌کند ‎while‎ می‌دهد و حلقه‎
#  ==============================================================
#     ‎کردن آنها  AND‎ قبل از ‎"condition 2"‎ و ‎"condition 1"‎ ارزیابی
#+   دارای اولویت ‎AND (-a)‎ با یکدیگر انجام می‌شود، چرا؟ برای اینکه 
#+ است، و بنابراین آخر ارزیابی می‌شود ‎-gt‎ و ‎-n‎ پایین‌تر از عملگرهای ‎


#################################################################

if [ -f /etc/sysconfig/i18n -a -z "${NOLOCALE:-}" ] ; then


# دوباره، جداکردن شرط ها
if [ -f /etc/sysconfig/i18n -a -z "${NOLOCALE:-}" ] ; then
#    --condition 1--------- ^^ --condition 2-----

#   موجود باشد ‎"/etc/sysconfig/i18n"‎ اگر فایل‎
#+                  ‎(-a)‎ و
#+        صفر باشد، آنوقت ‎$NOLOCALE‎ طول متغیر‎
#+ را  ‎(0)‎ موفقیت ‎[‎ عبارت شرطی داخل براکت‌ها ‎]‎
#+   برگشت می‌دهد و فرمانهای بعدی اجرا می‌گردند‎
#
#  آخر ارزیابی می‌گردد، زیرا در ‎AND (-a)‎ همچون مورد قبل 
#+ عملگرهای شرط داخل براکت‌هادارای پایین‌ترین اولویت است 
#  ==============================================================
#                                                                  :نکته‎
#      یک بسط پارامتر است که به نظر می‌رسد بیهوده باشد. اما ‎${NOLOCALE:-}‎‎
#.تنظیم می‌شود ‎null‎ تعریف نشده باشد، در نتیجه بیان کردنش به ‎$NOLOCALE‎ اگر
#                             .این در برخی مضمون‌ها تفاوتی به وجود می‌آورد

Tip

برای پرهیز از آشفتگی یا خطا در یک رشته پیچیده ازعملگرهای تست، رشته را به بخش‌هایی که داخل براکت‌ها قرار داده می‌شوند تجزیه کنید.

if [ "$v1" -gt "$v2"  -o  "$v1" -lt "$v2"  -a  -e "$filename" ]
# روشن نیست در اینجا چه پیش می‌رود‎

if [[ "$v1" -gt "$v2" ]] || [[ "$v1" -lt "$v2" ]] && [[ -e "$filename" ]]
# .خیلی بهتر است، شرط تست‌ها در بخش‌های منطقی گروه‌بندی شده‌اند

یادداشت‌ها

[1]

اولویت، در این مضمون، تقریباً دارای همان معنای حق تقدم است.