הגיון
כפי שגילינו בפרק 27, ה (()) פקודה מורכבת תומכת במגוון אופרטורים להשוואה. יש עוד כמה שניתן להשתמש בהם כדי להעריך את ההיגיון. הנה הרשימה המלאה:
טבלה 34-6: מפעילי השוואה
תיאור המפעיל
תיאור המפעיל
<= פחות או שווה ל
>= גדול או שווה ל
< פחות מ
> גדול מ
== שווה ל
!= לא שווה ל
&& לוגי AND
|| OR לוגי
expr1?expr2:expr3 אופרטור השוואה (שלישי). אם ביטוי expr1
אם כן, ההערכה היא שאינה אפס (אמתית אריתמטית). expr2, אחרת expr3.
כאשר משתמשים בהם לפעולות לוגיות, ביטויים פועלים לפי כללי הלוגיקה האריתמטית; כלומר, ביטויים המוערכים כאפס נחשבים לא נכון, בעוד שביטויים שאינם אפס נחשבים אמיתיים. ה (()) הפקודה מורכבת ממפה את התוצאות לקודי היציאה הרגילים של המעטפת:
[me@linuxbox ~]$ אם ((1)); ואז הדהוד "נכון"; אחרת הד "שקר"; fi
נָכוֹן
[me@linuxbox ~]$ אם ((0)); ואז הדהוד "נכון"; אחרת הד "שקר"; fi
שקר
[me@linuxbox ~]$ אם ((1)); ואז הדהוד "נכון"; אחרת הד "שקר"; fi
נָכוֹן
[me@linuxbox ~]$ אם ((0)); ואז הדהוד "נכון"; אחרת הד "שקר"; fi
שקר
המוזר ביותר מבין האופרטורים הלוגיים הוא מפעיל טרנארי. אופרטור זה (אשר מעוצב על פי זה בשפת התכנות C) מבצע בדיקה לוגית עצמאית. זה יכול לשמש כסוג של הצהרת אם/אז/אחר. הוא פועל על שלושה ביטויים אריתמטיים (מחרוזות לא יעבדו), ואם הביטוי הראשון נכון (או לא אפס) הביטוי השני מתבצע. אחרת, הביטוי השלישי מתבצע. נוכל לנסות זאת בשורת הפקודה:
[me@linuxbox ~]$ = 0 [me@linuxbox ~]$ ((a<1?++a:--a)) [me@linuxbox ~]$ מהדהד $ א
1
[me@linuxbox ~]$ ((a<1?++a:--a))
[me@linuxbox ~]$ מהדהד $ א
0
[me@linuxbox ~]$ = 0 [me@linuxbox ~]$ ((a<1?++a:--a)) [me@linuxbox ~]$ מהדהד $ א
1
[me@linuxbox ~]$ ((a<1?++a:--a))
[me@linuxbox ~]$ מהדהד $ א
0
כאן אנו רואים אופרטור משולש בפעולה. דוגמה זו מיישמת החלפת מצב. בכל פעם שהאופרטור מבוצע, הערך של המשתנה a עובר מאפס לאחד או להיפך.
שימו לב שביצוע מטלה בתוך הביטויים אינו פשוט.
כאשר ניסו, לחבוט יכריז על שגיאה:
[me@linuxbox ~]$ = 0
[me@linuxbox ~]$ ((a<1?a+=1:a-=1))
bash: ((: a<1?a+=1:a-=1: ניסיון הקצאה ללא משתנה (אסימון השגיאה הוא "-=1")
[me@linuxbox ~]$ = 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
= 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:(finished=1)))
עשה
#! / bin / bash
# arith-loop: סקריפט להדגמת אופרטורים אריתמטיים finished=0
= 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:(finished=1)))
עשה
בסקריפט זה, אנו מיישמים לולאה עד המבוססת על הערך של ה- מוגמר מִשְׁתַנֶה. בתחילה, המשתנה מוגדר לאפס (אריתמטי שקר) ואנו ממשיכים את הלולאה עד שהוא הופך ללא אפס. בתוך הלולאה, אנו מחשבים את הריבוע והקוביה של משתנה המונה
א. בסוף הלולאה, הערך של משתנה המונה מוערך. אם הוא קטן מ-10 (המספר המרבי של איטרציות), הוא גדל באחת, אחרת המשתנה המוגמר מקבל את הערך של אחד, מה שהופך את הגמר לנכון מבחינה אריתמטית, ובכך מסיים את הלולאה. הפעלת הסקריפט מביאה לתוצאה הבאה:
[me@linuxbox ~]$ arith-loop
[me@linuxbox ~]$ arith-loop
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