منطق
همانطور که در فصل 27 کشف کردیم، (( )) دستور ترکیبی از انواع عملگرهای مقایسه پشتیبانی می کند. چند مورد دیگر وجود دارد که می توان از آنها برای ارزیابی منطق استفاده کرد. این لیست کامل است:
جدول 34-6: عملگرهای مقایسه
توضیحات اپراتور
توضیحات اپراتور
<= کمتر یا مساوی
>= بزرگتر یا مساوی با
< کمتر از
> بزرگتر از
== برابر با
!= برابر نیست
&& منطقی و
|| منطقی OR
EXPR1?EXPR2:EXPR3 عملگر مقایسه (سه تایی). اگر بیان EXPR1
پس از آن غیر صفر (حساب درست) ارزیابی می شود EXPR2، دیگر EXPR3.
هنگامی که برای عملیات منطقی استفاده می شود، عبارات از قواعد منطق حسابی پیروی می کنند. یعنی عباراتی که به عنوان صفر ارزیابی می شوند نادرست در نظر گرفته می شوند، در حالی که عبارات غیر صفر درست در نظر گرفته می شوند. در (( )) دستور ترکیبی نتایج را در کدهای خروج عادی پوسته نگاشت می کند:
[me@linuxbox ~]$ اگر ((1))؛ سپس "درست" را تکرار کنید. other echo "نادرست"; فی
درست
[me@linuxbox ~]$ اگر ((0))؛ سپس "درست" را تکرار کنید. other echo "نادرست"; فی
غلط
[me@linuxbox ~]$ اگر ((1))؛ سپس "درست" را تکرار کنید. other echo "نادرست"; فی
درست
[me@linuxbox ~]$ اگر ((0))؛ سپس "درست" را تکرار کنید. other echo "نادرست"; فی
غلط
عجیب ترین عملگرهای منطقی این است اپراتور سه گانه. این عملگر (که پس از آن در زبان برنامه نویسی C مدل شده است) یک تست منطقی مستقل را انجام می دهد. می توان از آن به عنوان نوعی دستور if/then/else استفاده کرد. روی سه عبارت حسابی عمل میکند (رشتهها کار نمیکنند)، و اگر عبارت اول درست (یا غیر صفر) باشد، عبارت دوم انجام میشود. در غیر این صورت، عبارت سوم اجرا می شود. ما می توانیم این را در خط فرمان امتحان کنیم:
[me@linuxbox ~]$ a = 0 [me@linuxbox ~]$ ((a<1?++a:--a)) [me@linuxbox ~]$ پژواک $a
1
[me@linuxbox ~]$ ((a<1?++a:--a))
[me@linuxbox ~]$ پژواک $a
0
[me@linuxbox ~]$ a = 0 [me@linuxbox ~]$ ((a<1?++a:--a)) [me@linuxbox ~]$ پژواک $a
1
[me@linuxbox ~]$ ((a<1?++a:--a))
[me@linuxbox ~]$ پژواک $a
0
در اینجا ما یک عملگر سه تایی را در عمل می بینیم. این مثال یک ضامن را پیاده سازی می کند. هر بار که عملگر انجام می شود، مقدار متغیر a از صفر به یک یا برعکس سوئیچ می کند.
لطفاً توجه داشته باشید که انجام تکلیف در عبارات ساده نیست.
هنگام تلاش، بر هم زدن یک خطا اعلام می کند:
[me@linuxbox ~]$ a = 0
[me@linuxbox ~]$ ((a<1?a+=1:a-=1))
bash: ((: a<1?a+=1:a-=1: تلاش برای تخصیص به غیر متغیر (نشانه خطا "-=1" است)
[me@linuxbox ~]$ a = 0
[me@linuxbox ~]$ ((a<1?a+=1:a-=1))
bash: ((: a<1?a+=1:a-=1: تلاش برای تخصیص به غیر متغیر (نشانه خطا "-=1" است)
این مشکل را می توان با احاطه کردن عبارت انتساب با پرانتز کاهش داد:
[me@linuxbox ~]$ ((a<1?(a+=1):(a-=1)))
[me@linuxbox ~]$ ((a<1?(a+=1):(a-=1)))
در مرحله بعد، نمونه کامل تری از استفاده از عملگرهای حسابی را در اسکریپتی می بینیم که جدول ساده ای از اعداد را تولید می کند:
#! / bin / bash
# arith-loop: اسکریپت برای نشان دادن عملگرهای حسابی finished=0
a = 0
printf "a\ta**2\ta**3\n" printf "=\t====\t====\n"
تا ((تمام شد))؛ b=$((a**2))
c=$((a**3))
printf "%d\t%d\t%d\n" $a $b $c ((a<10?++a:(تمام شد=1)))
انجام شده
#! / bin / bash
# arith-loop: اسکریپت برای نشان دادن عملگرهای حسابی finished=0
a = 0
printf "a\ta**2\ta**3\n" printf "=\t====\t====\n"
تا ((تمام شد))؛ b=$((a**2))
c=$((a**3))
printf "%d\t%d\t%d\n" $a $b $c ((a<10?++a:(تمام شد=1)))
انجام شده
در این اسکریپت، ما یک حلقه تا بر اساس مقدار the پیاده سازی می کنیم به پایان رسید متغیر. در ابتدا، متغیر روی صفر تنظیم شده است (نادرست حسابی) و حلقه را تا زمانی که غیر صفر شود ادامه می دهیم. در حلقه، مربع و مکعب متغیر شمارنده را محاسبه می کنیم
آ. در انتهای حلقه، مقدار متغیر شمارنده ارزیابی می شود. اگر کمتر از 10 باشد (حداکثر تعداد تکرار)، یک افزایش مییابد، در غیر این صورت به متغیر finished مقدار یک داده میشود و از نظر حسابی کامل درست میشود و در نتیجه حلقه خاتمه مییابد. اجرای اسکریپت به این نتیجه می رسد:
[me@linuxbox ~]$ حلقه آریت
[me@linuxbox ~]$ حلقه آریت
a
= 0
1
2
3
4
5
6
7
8
9
10
a
= 0
1
2
3
4
5
6
7
8
9
10
a**2 a**3
==== ====
a**2 a**3
==== ====
0
1
4
9
16
25
36
49
64
81
100
0
1
4
9
16
25
36
49
64
81
100
0
1
8
27
64
125
216
343
512
729
1000
0
1
8
27
64
125
216
343
512
729
1000