תחי ישראל - אין לנו ארץ אחרת

תחי ישראל -אין לנו ארץ אחרת

if condition מדריך לקידוד תנאים בשפת Bash

מחבר:
בתאריך:

משפטי תנאי משמשים כשצריך לבחור בין חלופות. אם מתקיים תנאי אחד אז לעשות א'; אם אחר אז ב'. במדריך זה נלמד לקודד תנאים בשפת Bash.

מדריך ללימוד קידוד תנאים בשפת Bash if - else

להלן התחביר לכתיבת תנאי פשוט בשפת Bash:

if [ condition ]
then
    do something
fi
  • את התנאי מתחילים עם מילת המפתח if ומסיימים עם fi
  • את התנאי מקיפים סוגריים מרובעים. חשוב להקפיד על רווח בין התנאי לבין הסוגריים משני הצדדים.
  • בלוק הקוד אותו יש לבצע נכתב מתחת למילת המפתח then

נפתח את הטרמינל בתוך התיקייה בה אנו מחזיקים את הסקריפטים של Bash, ונוסיף את הקובץ עליו נעבוד במדריך:

$ touch conditions.sh

נהפוך את הקובץ לבר-ביצוע executable באמצעות הרצת הפקודה:

$ chmod +x conditions.sh

נפתח את הקובץ לעריכה באמצעות העורך nano (המתקדמים יכולים להשתמש ב-vim):

$ nano conditions.sh

בשורה הראשונה של הקובץ נכתוב shebang ואחריו את ה-path של bash:

conditions.sh

#! /usr/bin/bash

נוסיף לסקריפט קוד שבודק האם ערכו של משתנה x הוא 42, ואם המשתנה שווה ל-42 אז להדפיס הודעה למסך :

#! /usr/bin/bash

x=42

if [ $x -eq 42 ]
then
    echo "Yes, it is $x"
fi
  • האופרטור eq (קיצור של equal) בודק אם האגף השמאלי והימני של התנאי שווים.

נסגור את הקובץ ונשמור את תוכנו:

Ctrl + x

נריץ את הסקריפט:

$ ./conditions.sh

התוצאה:

Yes, it is 42
  • אם ערך המשתנה יהיה שונה מ-42 אז הקוד לא יצא אל הפועל ולא יודפס דבר למסך.

אפשר לעשות מזה משחק. נבקש מהמשתמש שיזין מספר בין 1 ל-100 :

#! /usr/bin/bash


echo "Pick a number between 1 and 100:  "

# user input
read x

if [ $x -eq 42 ]
then
    echo "$x is the meaning of life"
fi
  • הסקריפט מתחיל בבקשה מהמשתמש שיזין מספר
  • הערך אותו מזין המשתמש מאוחסן לתוך המשתנה x באמצעות הפקודה read
  • התנאי בודק אם המספר שווה 42 ואם זה המצב מוצא לפועל בלוק קוד שמציג הודעת עידוד

הבעיה עם הקוד שלנו שאם המשתמש מזין ערך אחר מזה המקיים את התנאי הסקריפט לא מראה כל פלט.

 

else המשלים של if

כדי לבצע קוד אחר במידה והתנאי לא מתקיים, נשתמש בבלוק - else .

בדוגמה הבאה, אם המספר שווה ל-42 מקבלים הודעה מסוימת, אחרת הודעה שונה:

# user input
echo "Pick a number between 1 and 100"

# user input
read x

if [ $x -eq 42 ]
then
    echo "$x is the meaning of life"
else
    echo "$x is not the number; Sorry, bro!"
fi
  • הסקריפט מתחיל בבקשה מהמשתמש שיזין מספר
  • הערך אותו מזין המשתמש מאוחסן לתוך המשתנה x באמצעות הפקודה read
  • התנאי בודק אם המשתנה שווה 42 ואם זה המצב מודפסת למסך הודעה מסוג אחד
  • אם התנאי לא מתקיים, והמשתנה שונה מ-42, מודפסת למסך הודעה אחרת

נשתמש במילת המפתח elif כדי לציין חלופות נוספות:

if [ $x -eq 42 ]
then
    echo "$x is the meaning of life"
elif [ $x -eq 37 ]
    then
    echo "$x is the most common number that people tend to pick"
else
    echo "$x is not the number; Sorry, bro!"
fi
  • אם if המספר הוא 42 אז then תדפיס הודעה אחת
  • אחרת, elif, אם המספר הוא 37 אז הודעה אחרת
  • בכל מקרה אחר, else, תדפיס הודעה מסוג שלישי המהווה ברירת מחדל

 

סוגי השוואות בשפת Bash

עד עכשיו ראינו רק השוואה מסוג "האם שווה ל-" באמצעות האופרטור eq . קיימים אופרטורים נוספים:

פירוש בעברית

פירוש באנגלית

אופרטור

שווה ל

equal

-eq

לא שווה ל-

not equal

-ne

גדול מ-

greater than

-gt

קטן מ-

less than

-lt

גדול או שווה ל-

greater than or equal to

-ge

קטן או שווה ל-

less than or equal to

-le

הקוד הבא בודק אם ערכו של המשתנה x שונה (ne) מ-42:

#! /usr/bin/bash
# set the value of variable
x=14

# check for inequality
if [ $x -ne 42 ]
then
    echo "$x is nice; 42 is even better."
else
    echo "Very good. $x is the meaning of life!"
fi
  • אם ערך המשתנה אינו 42 נקבל הודעה אחרת ממצב בו ערך המשתנה הוא 42.

התוצאה במקרה שלנו:

14 is nice; 42 is even better.

כאשר נזין 42 בתור ערכו של המשתנה אז נקבל:

Very good. 42 is the meaning of life!

 

השוואות מרובות

הרבה פעמים אנחנו צריכים שיתקיים יותר מתנאי אחד. לדוגמה, שיתקיים תנאי א' וגם ב'. או שיתקיים תנאי א' או ב'.

נשתמש באופרטור -a (מהמילה and) כדי לציין ששני תנאים צריכים להתקיים.

נשתמש באופרטור -o (מהמילה or) כדי לציין שלפחות אחד התנאים צריך להתקיים.

לדוגמה:

# needs to meet 2 conditions
# greater than 42
# and 
# less than 100
if [ $x -gt 42 -a $x -lt 100 ]
then
    echo "That's nice you need to advance"
elif [ $x -eq 100 ]
then
    echo "100 is awesome. What's your next endeavour?"
else
    echo "Not this time. Try again."
fi
  • התנאי בשורה הראשונה שואל אם ערך המשתנה גדול מ-42 וגם קטן מ-100

אבל רגע זה לא נגמר. יש תחליף חלופי.

אנחנו יכולים להשתמש ב-&& (and operator) כדי לבדוק האם שני תנאים מתקיימים:

if [ $x -gt 42 ] && [ $x -lt 100 ]
then
    echo "That's nice you need to advance"
fi
  • התנאי בודק אם ערך המשתנה גדול מ-42 וגם קטן מ-100

נשתמש ב-|| (or operator) כדי לבדוק האם לפחות אחד התנאים מתקיים:

if [ $x -le 42 ] || [ $x -ge 101 ]
then
    echo "Out of bound"
fi
  • התנאי בודק אם ערך המשתנה קטן או שווה 42 או גדול שווה ל-101

קיימת דרך נוספת להשתמש באופרטורים && ו-||.

אנחנו יכולים להשתמש ב-&& (and operator) כדי לבדוק האם שני תנאים מתקיימים וב-|| (or operator) כדי לבדוק האם לפחות אחד מתקיים אם נקיף את שני התנאים בסוגריים מרובעים כפולים [[...]]:

x=86
if [[ "$x" -gt 42 && "$x" -lt 100 ]]
then
    echo "That's nice you need to advance"
fi

התוצאה:

That's nice you need to advance

נשתמש ב-|| (or operator) לבדיקה אם אחד התנאים מתקיים:

x=12

if [[ "$x" -le 42 || "$x" -gt 100 ]]
then
    echo "Out of bound"
fi
  • שורת התנאי מורכבת משני תנאים שמספיק שאחד מהם יתקיים כדי ש-Bash יוציא את הפועל את בלוק הקוד וידפיס הודעה למסך.
  • הערך של המשתנה x הוא 12 ועל כן מתקיים התנאי הראשון (ערך המשתנה קטן שווה מ-42) וההודעה מודפסת למסך.

 

תחביר חלופי לקידוד תנאים

דרך נוספת לבדוק האם ביטוי מתמטי מתקיים היא באמצעות תחביר סוגריים עגולים כפולים (( … )):

echo "Please enter a number"

read my_number

if (( $my_number == 42 ))
then
   echo "Indeed $my_number is the meaning of life"
else
   echo "$my_number is interesting"
fi
  • בתחביר (( … )) נכתוב פעמיים סימן שווה == כדי לבדוק שוויון

נשתמש ב =! כדי ליצור תנאי אשר בודק העדר שוויון.

נראה דוגמה נוספת:

my_number=7

if (( $my_number % 2 != 0 ))
then
   echo "$my_number is odd"
else
   echo "$my_number is even"
fi

התוצאה:

7 is odd
  • האופרטור modulus (מסומן באמצעות %) מחזיר את מנת החלוקה. לדוגמה, מנת חלוקה של 7 ב-2 היא 1. מנת חלוקה של 7 ב-4 היא 3. מנת החלוקה של 7 ב-7 שווה 0.
  • אם מנת חלוקת המשתנה ב-2 שונה מ-0 המספר הוא פרט
  • אחרת המספר הוא זוגי

אפשרויות נוספות הם:

משמעות

קוד

האם המשתנה גדול מ-

(( $my_number > 42 ))

האם גדול או שווה ל-

(( $my_number >= 42 ))

האם המשתנה קטן מ-

(( $my_number < 42 ))

האם קטן או שווה ל-

(( $my_number <= 42 ))

נשתמש ב-&& כדי לציין ששני תנאים צריכים להתקיים וב-|| כדי לציין שלפחות אחד.

if (( $my_number % 2 == 0 && $my_number >= 42 ))
then
   echo "$my_number is even and large"
else
   echo "$my_number is not even or not large"
fi
  • התנאי בודק אם המשתנה הוא מספר זוגי וגדול או שווה מ-42.

 

השוואת מחרוזות

בהרבה מקרים נרצה לדעת אם שתי מחרוזות זהות או שונות. נשווה בין שתי מחרוזות באמצעות סימן השווה (= פעם אחת!):

my_lang="Bash"

if [ "$my_lang" = "Bash" ]
then
    echo "$my_lang is a great language"
elif [ "$my_lang" = "Python" ]
then
    echo "$my_lang is the way to go"
else
    echo "Sorry bro! don't know $my_lang"
fi
  • הודעה לבאים משפות תכנות נורמליות 😄 הסימן שווה פעם אחת, =, משמש להשוואה בין מחרוזות בתחביר סוגריים מרובעים יחידים [...]

לבדיקת העדר שוויון בין מחרוזות נשתמש בצירוף התווים =! .

אפשר להשוות מחרוזות בתחביר שונה המשתמש בשני סוגריים מרובעים [[...]] . כדי לבדוק אם שתי מחרוזות שוות בתחביר [[...]] נשתמש בשווה פעמיים ==:

my_lang="Bash"

if [[ "$my_lang" == "Bash" ]]
then
    echo "$my_lang is a great language"
elif [[ "$my_lang" == "Python" ]]
then
    echo "$my_lang is the way to go"
else
    echo "Sorry bro! don't know $my_lang"
fi

בתחביר [[...]] נשתמש בין הסוגריים ב-&& כדי לציין ששני תנאים צריכים להתקיים וב-|| כדי לציין שלפחות אחד.

בדוגמה הבאה נשאל האם ערך המשתנה הוא Bash או Python:

my_lang="Python"

if [[ "$my_lang" = "Bash" || "$my_lang" = "Python" ]]
then
    echo "$my_lang is a great language"
else
    echo "$my_lang sounds good"
fi

שימוש באופרטורים z או n בתחביר [[...]] מאפשר לנו לבדוק האם מחרוזת היא ריקה או שיש בה תווים.

האופרטור z בודק האם מחרוזת היא ריקה:

my_var=""

if [[ -z $my_var ]]
then
    echo "An empty string"
fi

התוצאה:

An empty string

האופרטור n בודק האם יש תווים במחרוזת:

my_var="aa"

if [[ -n $my_var ]]
then
    echo "Non empty string"
fi

התוצאה:

Non empty string

 

תנאי שבודק אם קבצים קיימים

אנחנו יכולים להשתמש בקידוד תנאים כדי לברר אם קבצים קיימים.

נוסיף לתיקייה בתוכה אנו עובדים את את הקובץ "myfile":

$ touch myfile

נשתמש בקוד הבא כדי לבדוק אם הקובץ קיים:

#! /usr/bin/bash

file=./myfile

if [ -f "$file" ]
then
    echo "$file exists"
else
     echo "$file doesn't exist"
fi
  • את שם הקובץ אנחנו מזינים בתור ערכו של המשתנה file.
  • האופרטור -f בודק האם קובץ קיים.
  • הסקריפט מדפיס למסך הודעות שונות במידה והקובץ קיים או חסר.

נשמור, ונריץ את הקובץ.

התוצאה:

./myfile exists

נמחק את הקובץ מתוך התיקייה:

$ rm ./myfile

אחרי המחיקה נריץ את הסקריפט, ונקבל:

./myfile doesn't exist

כפי שהאופרטור -f בודק האם קובץ קיים. האופרטור -d בודק האם תיקייה קיימת.

  • -f בודק האם קובץ קיים
  • -d בודק האם תיקייה קיימת

 

תנאי שבודק אם פקודה קיימת

אנחנו יכולים לבדוק האם פקודה קיימת על ידי הרצת הפקודה command -v עם שם התוכנה ישירות בטרמינל.

תחביר המקרה הכללי:

command -v [command_name]

נבדוק האם הפקודה tree מותקנת:

$ command -v tree
  • tree היא פקודה קלת משקל שמדפיסה את מבנה מערכת התיקיות והקבצים

מכיוון שהפקודה לא מותקנת אצלי על המחשב לא מודפס דבר למסך.

כדי להתקין את התוכנה אנחנו יכולים להשתמש בפקודה הבאה על מחשבי Ubuntu ו-Debian (יכולים להתקין אבל רגע):

sudo apt-get update && sudo apt-get install -y tree

בשלב זה נמתין עם ההתקנה כי אנחנו רוצים לכתוב סקריפט במקום להשתמש ישירות בטרמינל.

  • && - בשביל לשרשר פקודות. אחרי ביצוע הפקודה הראשונה יש להפעיל את הפקודה הבאה בתור.
  • אופרטור -y כדי להשתמש בהגדרות ברירת המחדל במהלך ההתקנה במקום לשאול אותנו בכל פעם. ההתקנה במקרה שלנו היא זריזה. אבל האופרטור -y יכול להועיל במיוחד כשמריצים תהליך ממושך ואנחנו לא רוצים לחכות מול הטרמינל עד לסיום או כאשר מריצים תהליכים באופן אוטומטי מחוץ לשעות העבודה.

הסקריפט הבא בודק האם פקודה קיימת. אחרת הוא מתקין אותה.

נוסיף לתיקיית הסקריפטים של Bash קובץ בשם "install_pkg.sh":

$ touch install_pkg.sh

נוסיף לתוך הקובץ את הקוד הבא:

#! /usr/bin/bash

# prompt to the user
echo "Which command would you like to execute?"

# assign the user input into a variable
read my_command

# check if the command exists 
# and act accordingly
if command -v $my_command
then
    echo "$my_command exists. No need to install"
else
    echo "$my_command not found. Installing it…"
    sudo apt-get update && sudo apt-get install -y $my_command
fi
echo "End of script"

נהפוך את הקובץ לבר-ביצוע executable באמצעות הפקודה:

$ chmod +x install_pkg.sh

נריץ את הסקריפט מתוך תיקיית הסקריפטים של Bash:

$ ./install_pkg.sh

התוצאה:

Which command would you like to execute?
tree
tree not found. Installing it…
[sudo] password for joe: 
Hit:1 //dl.google.com/linux/chrome/deb stable InRelease
Fetched 326 kB in 2s (175 kB/s)     
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following NEW packages will be installed:
  tree
0 upgraded, 1 newly installed, 0 to remove and 13 not upgraded.
Need to get 47.0 kB of archives.
After this operation, 114 kB of additional disk space will be used.
Get:1 //archive.ubuntu.com/ubuntu kinetic/universe amd64 tree amd64 2.0.3-1 [47.0 kB]
Fetched 47.0 kB in 0s (155 kB/s)
Selecting previously unselected package tree.
(Reading database ... 368381 files and directories currently installed.)
Preparing to unpack .../tree_2.0.3-1_amd64.deb ...
Unpacking tree (2.0.3-1) ...
Setting up tree (2.0.3-1) ...
Processing triggers for man-db (2.10.2-2) …
End of script

אחרי התקנת התוכנה tree אנחנו יכולים להריץ אותה על כל תיקייה במערכת.

כך נראה פלט התוכנית אחרי שהרצתי את tree על התיקייה הנוכחית בה אני מפתח את סדרת מדריכי ה- Bash:

$ tree .

התוצאה:

├── conditions.sh
├── hello.sh
├── install_pkg.sh
└── myfile

0 directories, 4 files

מקור טוב ללמוד על תכנות תנאים ב-Bash: https://tldp.org/LDP/abs/html/testconstructs.html

 

מדריכים נוספים בסדרת מדריכי לינוקס

סקריפט ראשון בשפת bash - שלום עולם כמובן!

מערכת הקבצים של Linux - מה שרצית לדעת ולא העזת לשאול

Cron job וקסמי האוטומציה

 

לכל המדריכים בסדרת הלינוקס

 

אהבתם? לא אהבתם? דרגו!

0 הצבעות, ממוצע 0 מתוך 5 כוכבים

 

 

המדריכים באתר עוסקים בנושאי תכנות ופיתוח אישי. הקוד שמוצג משמש להדגמה ולצרכי לימוד. התוכן והקוד המוצגים באתר נבדקו בקפידה ונמצאו תקינים. אבל ייתכן ששימוש במערכות שונות, דוגמת דפדפן או מערכת הפעלה שונה ולאור השינויים הטכנולוגיים התכופים בעולם שבו אנו חיים יגרום לתוצאות שונות מהמצופה. בכל מקרה, אין בעל האתר נושא באחריות לכל שיבוש או שימוש לא אחראי בתכנים הלימודיים באתר.

למרות האמור לעיל, ומתוך רצון טוב, אם נתקלת בקשיים ביישום הקוד באתר מפאת מה שנראה לך כשגיאה או כחוסר עקביות נא להשאיר תגובה עם פירוט הבעיה באזור התגובות בתחתית המדריכים. זה יכול לעזור למשתמשים אחרים שנתקלו באותה בעיה ואם אני רואה שהבעיה עקרונית אני עשוי לערוך התאמה במדריך או להסיר אותו כדי להימנע מהטעיית הציבור.

שימו לב! הסקריפטים במדריכים מיועדים למטרות לימוד בלבד. כשאתם עובדים על הפרויקטים שלכם אתם צריכים להשתמש בספריות וסביבות פיתוח מוכחות, מהירות ובטוחות.

המשתמש באתר צריך להיות מודע לכך שאם וכאשר הוא מפתח קוד בשביל פרויקט הוא חייב לשים לב ולהשתמש בסביבת הפיתוח המתאימה ביותר, הבטוחה ביותר, היעילה ביותר וכמובן שהוא צריך לבדוק את הקוד בהיבטים של יעילות ואבטחה. מי אמר שלהיות מפתח זו עבודה קלה ?

השימוש שלך באתר מהווה ראייה להסכמתך עם הכללים והתקנות שנוסחו בהסכם תנאי השימוש.

הוסף תגובה חדשה

 

 

ענה על השאלה הפשוטה הבאה כתנאי להוספת תגובה:

איך קוראים בעברית לצ`ופצ`יק של הקומקום?