השמה למשתנה בתהליך תנאי
רמת קושי: #beginners
באש מאפשרת ליצור תנאים שמבוססים על הרצה של פקודה, התנאי הבא שווה לtrue במידה והפקודה הצליחה ולא נכשלה.
ובשביל תנאי הפוך שמממש את ה-if מתי שהפקודה נכשלת מוסיפים ! לפני הפקודה
עד כאן כולם מכירים
מה שפחות מכירים היא האפשרות של השמה למשתנה כחלק מתהליך התנאי.
כפי שניתן לראות אנו מבצעים השמה למשתנה כחלק מתהליך התנאי, במידה והפקודה נכשלת המשתנה נשאר ריק ולא תתבצע שום השמה
#if
#conditions
#assignment
@bash_tips
רמת קושי: #beginners
באש מאפשרת ליצור תנאים שמבוססים על הרצה של פקודה, התנאי הבא שווה לtrue במידה והפקודה הצליחה ולא נכשלה.
if curl "${my_url}" ; then
my_logger "link to song: ${my_url}"
fi
ובשביל תנאי הפוך שמממש את ה-if מתי שהפקודה נכשלת מוסיפים ! לפני הפקודה
if ! curl "${my_url}" ; then
my_logger "failed to fetch: ${my_url}"
fi
עד כאן כולם מכירים
מה שפחות מכירים היא האפשרות של השמה למשתנה כחלק מתהליך התנאי.
if output=$(curl "${my_url}" | grep "rozy-*"); then
my_logger "user ${output} looged in"
fi
כפי שניתן לראות אנו מבצעים השמה למשתנה כחלק מתהליך התנאי, במידה והפקודה נכשלת המשתנה נשאר ריק ולא תתבצע שום השמה
#if
#conditions
#assignment
@bash_tips
לכתוב תנאים
רמת קושי: #beginners
כתיבה של תנאי בבאש יכולה להתבצע במספר דרכים, התנאי הפשוט נראה בצורה הבאה בה הביטוי ממוקם בין סוגריים
התנאי בודק את הביטוי ואם הוא true מה שבתוך התנאי יתממש.
חשוב לציין, תנאי בבאש לא מחזיר true או false אלא 0 ששוה בעצם לtrue ו 1 ששוה ערך ל false. התנהגות זו שונה מרוב שפות התכנות והסיבה לכך היא שרוב העבודה בבאש היא שימוש בהרבה תוכניות קטנות לבצע מטלה גדולה יותר כך שהתנאי בעצם בודק את הסטטוס קוד שהתוכנית מחזירה, סטטוס קוד 0 שווה לתוכנית שהסתיימה בהצלחה.
(למען הנוחות מכאן והלאה אתייחס ל 0 כ true ו 1 כ false)
קיצורים רבותיי
ישנה דרך מקוצרת לכתוב תנאי
מה שקורה פה הוא שאנו מריצים ביטוי שיחזיר לנו true או false, במידה והוא יחזיר true אז הוא ימשיך לקוד הבא, במידה וביטוי שלנו החזיר false מה שנמצא לאחר ה
הטריק הזה כמובן יעבוד גם בצורה ההפוכה על ידי שימוש ב
מה לא לעשות?
הדרך הקצרה לפעמים היא הדרך הכואבת וזה נכון גם במקרה הזה, בעוד ששימוש בתנאי רגיל יחזיר תמיד סטטוס קוד 0 וזה לא משנה אם הביטוי החזיר true או false
$
$
שימוש בתנאי מקוצר מחזיר סטטוס קוד 1 במידה והביטוי החזיר false
$
$
$
1
זה כבר הופך להיות בעיה של ממש, במיוחד אם הסקריפט משולב כחלק מה pipeline.
#if
#exit_code
#conditions
@bash_tips
רמת קושי: #beginners
כתיבה של תנאי בבאש יכולה להתבצע במספר דרכים, התנאי הפשוט נראה בצורה הבאה בה הביטוי ממוקם בין סוגריים
if [[ 1 -eq 1 ]]
then
echo "I'm in"
fi
התנאי בודק את הביטוי ואם הוא true מה שבתוך התנאי יתממש.
חשוב לציין, תנאי בבאש לא מחזיר true או false אלא 0 ששוה בעצם לtrue ו 1 ששוה ערך ל false. התנהגות זו שונה מרוב שפות התכנות והסיבה לכך היא שרוב העבודה בבאש היא שימוש בהרבה תוכניות קטנות לבצע מטלה גדולה יותר כך שהתנאי בעצם בודק את הסטטוס קוד שהתוכנית מחזירה, סטטוס קוד 0 שווה לתוכנית שהסתיימה בהצלחה.
(למען הנוחות מכאן והלאה אתייחס ל 0 כ true ו 1 כ false)
קיצורים רבותיי
ישנה דרך מקוצרת לכתוב תנאי
[[ 1 -eq 1 ]] && echo "do it"
מה שקורה פה הוא שאנו מריצים ביטוי שיחזיר לנו true או false, במידה והוא יחזיר true אז הוא ימשיך לקוד הבא, במידה וביטוי שלנו החזיר false מה שנמצא לאחר ה
&&
לא יבוצע.הטריק הזה כמובן יעבוד גם בצורה ההפוכה על ידי שימוש ב
||
כך שהמשך הקוד יתבצע רק עם הביטוי יכשל.מה לא לעשות?
הדרך הקצרה לפעמים היא הדרך הכואבת וזה נכון גם במקרה הזה, בעוד ששימוש בתנאי רגיל יחזיר תמיד סטטוס קוד 0 וזה לא משנה אם הביטוי החזיר true או false
$
cat /tmp/test.sh
#!/bin/bash
if [[ 1 -eq 0 ]]
then
echo "I'm in"
fi
echo $?
$
bash /tmp/test.sh
$ echo $?
0שימוש בתנאי מקוצר מחזיר סטטוס קוד 1 במידה והביטוי החזיר false
$
cat /tmp/test.sh
#!/bin/bash
[[ 1 -eq 0 ]] && echo "Do it"
$
bash /tmp/test.sh
$
echo $?
1
זה כבר הופך להיות בעיה של ממש, במיוחד אם הסקריפט משולב כחלק מה pipeline.
#if
#exit_code
#conditions
@bash_tips
לכתוב תנאים - הרחבה
רמת קושי: #beginners
מספר דרכים לכתוב תנאי בבאש, להלן קצת סדר
סוגריים עגולים כפולים (( ))
סוג תנאי שעובד רק על מספרים ומתאים לבדיקת פעולות חשבוניות.
פקודה הבודקת ביטויי השוואה ממש כמו if, מחזירה true ל0 וfalse לכל מה שאינו 0
פקודה המבצעת בדיוק את את אותן פעולת שמבצעת פקודת test, ההבדל היחידי בין השניים הוא שפקודת test תגיב לדגלי
חשוב לשים לב שמשתמשים ותיקים עלולים לתהות מה ההבדל בין
ובכן, בעוד הראשון הוא לעתים פקודה בפני עצמה (מקבילה ל־
$
למשל, במקום
אופרטור =~ מה חשוב לדעת?
חשוב רק לציין שבמידה ומשתמשים באופרטור ההשוואה
$
קרדיט: תודה רבה לתומר @tomer מקבוצת @linux_il על הפוסט! (אז מה אם הוא השתנה מעט)
למי שלא מכיר קבוצת לינוקס ישראל היא אחת הקבוצות היותר טובות והיותר פעילות בטלגרם (כל עוד לא מדברים על קאלי).
#[
#if
#test
#regex
#conditions
@bash_tips
רמת קושי: #beginners
מספר דרכים לכתוב תנאי בבאש, להלן קצת סדר
סוגריים עגולים כפולים (( ))
סוג תנאי שעובד רק על מספרים ומתאים לבדיקת פעולות חשבוניות.
if (( 1 == 1 )); thenפקודת test
...
פקודה הבודקת ביטויי השוואה ממש כמו if, מחזירה true ל0 וfalse לכל מה שאינו 0
test 1 -ne 0סוגרים מרובעים בודדים [ ]
test string1 = string2
test -n string
...
פקודה המבצעת בדיוק את את אותן פעולת שמבצעת פקודת test, ההבדל היחידי בין השניים הוא שפקודת test תגיב לדגלי
--help, ו --version
if [ 1 -ne 0 ]סוגריים מרובעים כפולים [[ ]]
if [ string1 = string2 ]
if [ -n string ]
חשוב לשים לב שמשתמשים ותיקים עלולים לתהות מה ההבדל בין
[
ל [[
. ובכן, בעוד הראשון הוא לעתים פקודה בפני עצמה (מקבילה ל־
test
) $
whereis [
[: /usr/bin/[ /usr/share/man/man1/[.1.gzהשנייה היא רק פקודה מובנית ב־shell ונותנת לנו יכולות מתקדמות יותר.
למשל, במקום
-eq
כדי לבחון שיוויון, אפשר להשתמש בסימן שיוויון נורמלי. if [[ 1 -eq 1 ]]
לעומתif [[ 1 = 1 ]]
וברמת העיקרון אפשר גם לוותר על תחימה במרכאות של מחרוזות שכוללות תו רווח כי ה־shell יצליח להבין איך להתמודד עם זה.if [ -f "$filename" ]
לעומתif [[ -f $filename ]]
כבונוס, ישנו את האופרטור החשוב =~ המאפשר להשתמש בביטויים רגולריים ישירות מתנאי ההשוואה, וכך לחסוך ביטויים לוגיים מורכבים.אופרטור =~ מה חשוב לדעת?
חשוב רק לציין שבמידה ומשתמשים באופרטור ההשוואה
=~
יש הבדל בין משתנה העטוף בגרשיים (להלן מגורגש) לכזה שאינו, ברגע שמעבירים לתנאי משתנה מגורגש הביטוי מחפש את כל מחרוזת הטקסט שבמשתנה בצורה גולמית ולא מנסה להשוות את המשתנה כביטוי regex$
cat file.txt
111+.*pdf{}[]$$
[[ $(cat file.txt) =~ "pdf{}" ]] && echo match
match$
[[ $(cat file.txt) =~ pdf{} ]] && echo match
$ echo $?
1מצד אחד זה מאפשר לנו לבדוק התאמה של תת מחרוזות שמכילות תווים מיוחדים בצורה גולמית, מצד שני מי שלא מכיר את צורת התנהגות זו עשוי לבזבז זמן ולתהות מדוע דברים אינם מתנהגים כמצופה.
קרדיט: תודה רבה לתומר @tomer מקבוצת @linux_il על הפוסט! (אז מה אם הוא השתנה מעט)
למי שלא מכיר קבוצת לינוקס ישראל היא אחת הקבוצות היותר טובות והיותר פעילות בטלגרם (כל עוד לא מדברים על קאלי).
#[
#if
#test
#regex
#conditions
@bash_tips