عملگرها

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

8.1- عملگرها

اختصاص دادن

تخصیص متغیر

ارزش‌گذاری یا تغییر محتوای یک متغیر

=

عملگر تخصیص همه منظوره، که برای هر دو تخصیص رشته‌ای و حسابی عمل می‌کند.

var=27
category=minerals  # 

Caution

عملگر "=" تخصیص را با عملگر = تست اشتباه نکنید.

# 

if [ "$string1" = "$string2" ]
then
   command
fi

#   برای پیش‌گیری از یک پیغام خطا در صورت تهی بودن یکی از متغیرها،
#+ 
#             (کاراکترهای ‎"X"‎ پیشوند شده، یکدیگر را خنثی می‌کنند.)

عملگرهای حسابی

+

جمع

-

تفریق

*

ضرب

/

تقسیم

**

توان

# 

let "z=5**3"    # 
echo "z = $z"   # 

%

modulo‏، یا mod ( باقیمانده یک عملیات تقسیم صحیح را برگشت می‌دهد)

bash$ expr 5 % 3
2
‎5/3 = 1‎ است با باقیمانده ‎2‎

این عملگر در تولید اعداد داخل یک محدوده خاص ( مثال ‎9-11‎ و مثال ‎9-15‎ را ببینید) و قالب‌بندی خروجی برنامه ( مثال ‎27-16‎ و مثال ‎A-6‎ را ببینید) سودمند واقع می‌شود. حتی می‌تواند برای تولید اعداد اول به کار برود (مثال ‎A-15‎ را ببینید). Modulo به طور شگفت‌انگیزی در دستورالعمل‌های عددی ظاهر می‌شود.

مثال ‎8-1‎. بزرگترین مقسوم علیه مشترک

#!/bin/bash
# 
#

#
#+   
‎
#
#
#+
#+
#+
#
#
#‎
#+


#
#
ARGS=2
E_BADARGS=85

if [ $# -ne "$ARGS" ]
then
  echo "Usage: `basename $0` first-number second-number"
  exit $E_BADARGS
fi
# ------------------------------------------------------


gcd ()
{

  dividend=$1             #
  divisor=$2              #
                          #                 

  remainder=1             #
                          #+

  until [ "$remainder" -eq 0 ]
  do    #
    let "remainder = $dividend % $divisor"
    dividend=$divisor     #
    divisor=$remainder
  done                    #                   

}                #


gcd $1 $2

echo; echo "GCD of $1 and $2 = $dividend"; echo


#                  
#
#
#+
#

exit 0
‎+=‎

افزایش-مساوی (افزایش مقدار ثابت به متغیر) ‎[1]‎

‎let "var += 5"‎ به این منجر می‌شود که 5 به var اضافه شود.

‎-=‎

تفریق-مساوی (تفریق مقدار ثابت از متغیر)

‎*=‎

ضرب-مساوی (ضرب مقدار ثابت در متغیر)

‎let "var *= 4"‎ منجر به این می‌گردد که var ضرب در 4 بشود.

‎/=‎

تقسیم-مساوی (تقسیم متغیر بر مقدار ثابت)

‎%=‎

باقیمانده-مساوی (باقیمانده تقسیم متغیر بر مقدار ثابت)

عملگرهای حسابی بیشتر اوقات در یک عبارت expr یا let واقع می‌شوند.

مثال ‎8-2‎. کاربرد عملگرهای حسابی

#!/bin/bash
#

n=1; echo -n "$n "

let "n = $n + 1"   #
echo -n "$n "


: $((n = $n + 1))
#
#+
echo -n "$n "

(( n = n + 1 ))
#
#
echo -n "$n "

n=$(($n + 1))
echo -n "$n "

: $[ n = $n + 1 ]
#
#+
#
echo -n "$n "

n=$[ $n + 1 ]
#
#*
#
echo -n "$n "

#      
#

let "n++"          #
echo -n "$n "

(( n++ ))         #
echo -n "$n "

: $(( n++ ))       #
echo -n "$n "

: $[ n++ ]         #
echo -n "$n "

echo

exit 0

متغیرهای صحیح در نگارش‌های قدیمی‌تر Bash، اعداد صحیح بلند با علامت ‎(32-bit)‎ در محدوده ‎-2147483648‎ تا ‎2147483647‎ بودند. عملیاتی که متغیری خارج از این محدوده دریافت می‌کرد، یک نتیجه اشتباه‌آمیز ارایه می‌داد.

echo $BASH_VERSION   #

a=2147483646
echo "a = $a"        #
let "a+=1"           #
echo "a = $a"        #
let "a+=1"           #
echo "a = $a"        #
                     #
                     # +
                     # +

در نتیجه Bash از نگارش ‎>= 2.05b‎ از اعداد صحیح ۶۴ بیتی پشتیبانی می‌کند.

Caution

Bash حساب ممیز شناور را نمی‌فهمد. با اعداد شامل نقطه اعشار به عنوان رشته رفتار می‌کند.

a=1.5

let "b = $a + 1.3"  #
#
#

echo "b = $b"       #

در اسکریپت‌هایی که به محاسبات اعشاری یا توابع کتابخانه‌ای ریاضی نیاز دارند از bc استفاده کنید.


عملگرهای بیتی. عملگرهای بیتی به ندرت در اسکریپت‌های پوسته ظهور می کنند. به نظر می‌رسد کاربرد عمده آنها برای دستکاری و بررسی کمیت‌های خوانده شده از پورت‌ها یا سوکت‌ها باشد. «وارونه‌سازی وضعیت بیت‌ها» بیشتر برای زباهای ترجمه شونده، از قبیل C و ‎C++‎ که دسترسی مستقیم به سخت‌افزار سیستم را فراهم می‌کنند مناسب است. به هر حال، ابتکار vladz در به کار بردن عملگرهای بیتی در اسکریپت ‎base64.sh‎ او (مثال ‎A-54‎) را ملاحظه نمایید.

عملگرهای بیتی

‎<<‎

انتقال به چپ بیتی (ضرب در 2 برای هر نقل‌مکان)

‎<<=‎

left-shift-equal

‎let "var <<= 2"‎ موجب می‌گردد var به اندازه 2 بیت به سمت چپ نقل‌مکان کند (ضربدر 4)

‎>>‎

نقل‌مکان بیتی به راست (تقسیم بر 2 برای هر نقل‌مکان)

‎>>=‎

right-shift-equal (برعکس ‎<<=‎ است)

‎&‎

AND بیتی

‎&=‎

‎AND-equal‎ بیتی

|

OR بیتی

‎|=‎

OR-equal بیتی

~

نفی بیتی

^

XOR بیتی

‎^=‎

XOR-equal بیتی

عملگرهای منطقی (boolean)

!

نفی

if [ ! -f $FILENAME ]
then
  ...
&&

و

if [ $condition1 ] && [ $condition2 ]
#
#

if [[ $condition1 && $condition2 ]]        #
#   

&& همچنین نسبت به مضمون می‌تواند در یک and list برای به هم پیوستن فرمان‌ها به کار برود.

||

یا

if [ $condition1 ] || [ $condition2 ]
#
#

if [[ $condition1 || $condition2 ]]            #
#      

Bash وضعیت خروج هر جمله متصل شده توسط یک عملگر منطقی را بررسی می‌کند.

مثال ‎8-3‎. بررسی‌های شرط مرکب با استفاده از ‎&&‎ و ‎||‎

#!/bin/bash

a=24
b=47

if [ "$a" -eq 24 ] && [ "$b" -eq 47 ]
then
  echo "Test #1 succeeds."
else
  echo "Test #1 fails."
fi

#    خطا: سطر ‎if [ "$a" -eq 24 && "$b" -eq 47 ]‎ سعی در اجرای
#+   فرمان ‎' [ "$a" -eq 24 '‎‎ نموده و در پیدا کردن جفت ‎']'‎ آن
#                                        باشکست مواجه می‌گردد.
#
#
#       (معنی ‎"&&"‎ در سطر ۱۷ متفاوت با معنی آن در سطر ۶ است.)
#


if [ "$a" -eq 98 ] || [ "$b" -eq 47 ]
then
  echo "Test #2 succeeds."
else
  echo "Test #2 fails."
fi


#
#       .برای اشاره به این مورد ‎Patrick Callahan‎ با تشکر از‎


if [ "$a" -eq 24 -a "$b" -eq 47 ]
then
  echo "Test #3 succeeds."
else
  echo "Test #3 fails."
fi


if [ "$a" -eq 98 -o "$b" -eq 47 ]
then
  echo "Test #4 succeeds."
else
  echo "Test #4 fails."
fi


a=rhino
b=crocodile
if [ "$a" = rhino ] && [ "$b" = crocodile ]
then
  echo "Test #5 succeeds."
else
  echo "Test #5 fails."
fi

exit 0

عملگرهای && و || در یک مضمون حسابی نیز مورد استفاده واقع می‌شوند.

bash$ echo $(( 1 && 2 )) $((3 && 0)) $((4 || 0)) $((0 || 0))
1 0 1 0

عملگرهای متفرقه

,

عملگر کاما

عملگر کاما دو یا چند عملیات حسابی را بهم زنجیر می‌کند. تمام عملکردها (با آثار جانبی محتمل) ارزیابی می‌شوند. [2]

let "t1 = ((5 + 3, 7 - 1, 15 - 4))"
echo "t1 = $t1"        #
#  

let "t2 = ((a = 9, 15 / 3))"     #
echo "t2 = $t2    a = $a"        # 

عملگر کاما اساساً در حلقه‌های for مورد استفاده واقع می‌شود. مثال ‎11-13‎ را ببینید.

یادداشت‌ها

[1]

در یک مضمون متفاوت، ‎+=‎ می‌تواند به عنوان یک عملگر الحاق رشته به کار برود. این می‌تواند برای ویرایش متغیرهای محیط سودمند باشد.

[2]

البته آثار جانبی، نتایج ناخواسته -- و معمولاً نامطلوب -- هستند.