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

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

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

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

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

bash scripting - hello world

במדריך זה נכתוב את הסקריפט הראשון בשפת הבאש, שהוא כמובן hello world אבל קודם שנתחיל במלאכת הקידוד נסביר את ההבדל בין שלושה מושגים שמבלבלים את המתחילים: טרמינל, shell ו-bash.

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

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

ה-shell עובד בדרך כלל עם פקודות בשפת bash.

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

Ctrl + Alt + t

נקליד את הפקודה הבאה בתוך הטרמינל:

$ echo $0

התוצאה תהיה בדרך כלל:

bash
  • מכיוון ש-bash היא השפה ברירת המחדל של ה-shell על מערכות הפעלה מסוג לינוקס.

כפי שניתן להקליד פקודות bash בתוך הטרמינל אפשר לכתוב אותם לתוך קובץ שאותו מריצים כמקובל בשפות מחשב אחרות דוגמת python ו- JavaScript.

קבצים הכתובים בשפת bash מכונים סקריפטים של bash.

אחד השימושים הנפוצים בסקריפטים של bash הוא לצורך אוטומציה של משימות מייגעות. לדוגמה, אם אתה צריך לגבות אתר פעם בשבוע. אתה יכול לכתוב סקריפט bash שרץ בשעה קבועה פעם בשבוע, דוחס את מערכת הקבצים ואת מסד הנתונים, ומקבץ אותם לתיקייה הכוללת בשמה את מועד הפעולה. כך חסכת לעצמך 20 דקות עבודה מדי שבוע ו-18 שעות בשנה.

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

  

כתיבת הסקריפט הראשון בשפת bash

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

כדי לדעת את הנתיב path של bash במערכת נקליד לתוך הטרמינל את הפקודה:

$ which bash

התוצאה אצלי:

/usr/bin/bash
  • התוצאה אצלך יכולה להיות שונה.
  • נשמור את הנתיב כי אנחנו צריכים אותו בשביל השורה הראשונה של הסקריפטים שאנחנו כותבים.

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

ניצור את התיקייה על ידי הקלדת הפקודה:

$ mkdir ~/bash_tutorials/

נכנס לתוך התיקייה:

$ cd ~/bash_tutorials/

בתוכה ניצור את קובץ הסקריפט הראשון שלנו בשפת באש:

$ touch helloWorld.sh
  • נוסיף את הסיומת .sh כדי לציין שהקובץ כתוב ב-bash.

נפתח את הקובץ לעריכה באמצעות nano:

$ nano helloWorld.sh
  • nano הוא עורך טקסט שעובד בתוך הטרמינל/שורת הפקודות.
  • משתמשים מתקדמים מעדיפים לערוך קבצים באמצעות Vim שהוא מאוד חזק אבל קשה יותר למתחילים.

כך זה נראה על מסך הטרמינל שלי:

nano editor in my bash terminal on a Linux system

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

helloWorld.sh

#! /usr/bin/bash

   

  • השורה הזו אומרת למערכת ההפעלה להריץ את הסקריפט באמצעות shell שעובד עם bash.
  • נקפיד להוסיף את השורה בראש כל סקריפט.

בשורות הבאות נכתוב את הסקריפט עצמו.

נוסיף את השורה שתציג את הטקסט hello world:

helloWorld.sh

#! /usr/bin/bash

echo "hello world"

   

נשמור את הקובץ באמצעות צירוף המקשים:

Ctrl + x

  • nano שואל אותנו האם לשמור את השינויים אז נאשר
  • אחרי שנאשר פעמיים nano ייסגר, ושוב נקבל את מסך הטרמינל הרגיל.

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

$ ./helloWorld.sh
  • לפני שם הקובץ כתבנו "./" כי אנחנו רוצים להריץ מתוך התיקייה בתוכה אנו נמצאים כרגע עם הטרמינל.

התוצאה היא אולי לא מה שציפינו:

bash: ./helloWorld.sh: Permission denied
  • נראה שאין לנו הרשאה להריץ את הסקריפט.

נבדוק את הרשאות הקובץ:

ls -l

התוצאה:

-rw-rw-r-- 1 joe joe   37 Mar  4 22:02 helloWorld.sh
  • בחלק השמאלי של השורה מופיעות הרשאות הקובץ:

    -rw-rw-r--

    נקרא אותם משמאל לימין:

    1. הקו המפריד בשמאל השורה אומר לנו שזה קובץ ולא תיקייה (תיקייה מסומנת ב-d לעומת קובץ המסומן בקו מפריד)
    2. 3 התווים הבאים הם הרשאות הבעלים owner שזה אנחנו rw-
    3. 3 התווים הבאים הם הרשאות הקבוצה group : rw-
    4. 3 התווים הבאים הם הרשאות של כל היתר r--
    5. יש 3 הרשאות אפשריות: r כדי לאפשר קריאה של הקובץ, w כדי לאפשר כתיבה לקובץ, ו-x המאפשר ביצוע, הרצה של הקובץ.
    6. אנחנו יכולים לראות שלנו בתור הבעלים owner של הקובץ חסרה הרשאה להרצת הקובץ.

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

כדי להריץ את הסקריפט נצייד אותו בהרשאה מתאימה.

נקליק את הפקודה הבאה אל תוך הטרמינל כדי להפוך אותו לבר ביצוע executable, ניתן להרצה:

$ chmod +x helloWorld.sh

נוודא שאנחנו הבעלים owner יכולים להריץ את הקובץ:

ls -l

התוצאה:

-rwxrw-r-- 1 joe joe   37 Mar  4 22:02 helloWorld.sh
  • הרשאות הבעלים הם עכשיו rwx מה שאומר שאנחנו יכולים לקרוא (r), לכתוב (w), ולהריץ את הסקריפט (x).

התקדמנו.

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

$ ./helloWorld.sh
  • חשוב להריץ את הפקודה מתוך התיקייה שבה נמצא הסקריפט.
  • נקפיד להוסיף ./ לפני שם הקובץ.

נקליק Enter ונראה את התוצאה של הסקריפט שכתבנו כתובה על מסך הטרמינל:

hello world

 

שימוש במשתנים בשפת Bash

כמו כל שפת תכנות גם שפת Bash כוללת משתנים.

נשתמש בזה כדי להחליף את המחרוזת "world" במחרוזת אחרת.

ניפתח את קובץ הסקריפט לעריכה באמצעות nano:

$ nano helloWorld.sh

נוסיף משתנה שנקרא לו my_name ונציב לתוכו מחרוזת שאנחנו רוצים להציג חזרה למשתמש:

helloWorld.sh

#! /usr/bin/bash

my_name="Joe"

echo "hello world" 

 

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

נשבץ את המשתנה לתוך ההודעה שאנחנו רוצים להדפיס למסך:

helloWorld.sh

#! /usr/bin/bash

my_name="Joe"

echo "hello $my_name"

 

  • הוספנו את שם המשתנה לתוך המחרוזת והקפדנו להוסיף את הקידומת $ כדי ש-Bash יוכל לדעת שזה משתנה ולא טקסט רגיל.

נסגור את העורך nano באמצעות הקלקלת צירוף המקשים:

Ctrl + x

  • באפשרויות שיפתח בפנינו העורך נבחר לשמור את הקובץ בשמו.

נריץ את הסקריפט באמצעות הפקודה:

$ ./helloWorld.sh

 

התוצאה:

hello Joe

 

הוספת הערות לסקריפט Bash

כדאי להוסיף הערות לקוד כי לא בטוח שמי שיקרא את הקוד בעתיד, כולל אנחנו, נזכור בדיוק מה עבר למתכנת בראש כשהוא כתב אותו.

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

נוסיף הערות לקוד:

helloWorld.sh

#! /usr/bin/bash

# assign variable
my_name="Joe"

# concatenate to a string
echo "hello $my_name"

 

  • ההערות מיועדות למתכנתים ולא למשתמשים בתוכנה כי רק מי שקורא את הקוד יכול לראות אותם.
  • השורה הראשונה פותחת בסולמית. זו לא הערה אלא shebang #! /usr/bin/bash בשביל שמערכת ההפעלה תדע להריץ את הסקריפט.

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

$ ./helloWorld.sh

התוצאה:

hello Joe
  • המשתמשים בסקריפט לא רואים את ההערות. רק מי שקורא את הקוד רואה אותם.

 

קבלת מידע מהמשתמש User Input

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

read var1

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

read my_name

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

ניפתח את קובץ הסקריפט לעריכה באמצעות nano:

$ nano helloWorld.sh

ונערוך את תוכנו:

helloWorld.sh

#! /usr/bin/bash

# ask user for their name
echo "What's your name? "

# assign user input to variable
read my_name

# output to user
echo "hello $my_name"

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

$ ./helloWorld.sh

התוצאה:

What's your name?

נקליד את שמנו לתוך הטרמינל, לדוגמה:

What's your name?
Joe

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

What's your name?
Joe
hello Joe

אנחנו יכולים לבקש מהמשתמש להזין קלט, ולהציב את ערך הקלט בתור ערכו של המשתנה בשורה אחת:

# ask user for their name
# and assign user input to variable
# at the same line
read -p "What's your name? " my_name
  • האופציה -p (קיצור של prompt) אומרת שהמשתמש יזין את הקלט בהמשך לשורה שבה מודפסת ההודעה.

 

העברת ארגומנטים לסקריפט

דרך נוספת להעברת מידע מהמשתמש לסקריפט היא ע"י העברת positional arguments. התוכנה מעבדת את הארגומנטים שאנחנו מעבירים לסקריפט כשאנחנו מריצים אותו על פי סדר ההזנה: לארגומנט הראשון ניגש באמצעות $1, לארגומנט השני באמצעות $2, וכיו"ב.

נפתח את הקובץ לעריכה ונחליף את הקוד בתוכו בקוד הבא:

#! /usr/bin/bash

# get positional parameters
greet=$1
name=$2

# use the parameters in the string
echo "$greet, $name."
  • הסקריפט מצפה לקבל 2 ארגומנטים מבוססי מיקום positional arguments: את הראשון הוא יציב בתור ערכו של המשתנה greet; את השני בתור ערך המשתנה name.
  • בהמשך, הסקריפט מחבר מהמשתנים מחרוזת אותה הוא מציג למשתמש על מסך הטרמינל.

נריץ את הקוד תוך שאנו מעבירים את שני הפרמטרים:

$ ./helloWorld.sh "You are awesome" Joe
  • הפרמטר הראשון אותו אנו מעבירים לסקריפט בזמן שאנחנו מריצים אותו הוא "You are awesome"
  • הפרמטר השני הוא Joe

התוצאה:

$ ./helloWorld.sh "You are awesome" Joe
You are awesome, Joe.

  

שימוש במשתני סביבה בסקריפט Bash

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

דוגמה למשתנה סביבה כזה הוא HOME שזו תיקיית הבית של המשתמש הנוכחי.

נדפיס את המשתנה סביבה HOME למסך הטרמינל באמצעות הרצת הפקודה הבאה בטרמינל:

$ echo $HOME

התוצאה אצלי:

/home/joe
  • בהתאם לשם המשתמש שלי.

משתני סביבה נוספים שחשוב להכיר הם:

  • PWD - התיקייה הנוכחית
  • USER - שם המשתמש
  • PATH - הנתיב לתיקיות המכילות את הסקריפטים ברי הביצוע. דוגמת התיקיות המכילות את הקבצים הבינאריים הדרושים להרצת תוכנות מסוימות.

כדי לראות את רשימת משתני הסביבה על מערכת ההפעלה שלך תריץ את הפקודה הבאה בטרמינל:

$ printenv

 

נחזור לסקריפט, ונחליף את הקוד:

Use of environment variables in Bash code

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

 

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

את התאריך כרגע נקבל מהפקודה date שצריך לפרמט כדי להציג. לפרמט זה לתת צורה.

בשביל תאריך בפורמט המקובל בארץ:

`date +%d/%m/%Y`
  • d - היום בחודש.
  • m - החודש בספרות.
  • Y - השנה.

בשביל להציג זמן כולל שעות, דקות ושניות:

`date +%d/%m/%Y`

עכשיו הכול ביחד:

Use of formatted date time string in Bash scripts

  

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

מה זה טרמינל?

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

ניהול הרשאות, משתמשים וקבוצות בלינוקס

 

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

 

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

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

 

 

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

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

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

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

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

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

 

 

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

איך אומרים בעברית אינטרנט?

 

תמונת המגיב

ננו בתאריך: 13.06.2022

תודה עזר לי

תמונת המגיב

חילי בתאריך: 07.12.2022

אלוףףףףףףףףףףףףףףףףףףף

תמונת המגיב

חובבן ומשוטט בתאריך: 22.06.2023

מדריך כמעט מעולה, קריא ונוח לניווט (מרוכז). לגבי הכמעט מעולה :), זיהיתי 2 טעויות קטנות. 1)"כדי להשתמש במרכאות כפולות בתוך מחרוזת המוקפת גם היא במרכאות כפולות אנחנו חייבים להבריח, לעשות אסקייפ למרכאות הפנימיות בעזרת סלאש." צריך להיות סלאש אחורי. 2)"בשביל להציג זמן כולל שעות, דקות ושניות:" לא הצגת את המלל של הפקודה, רק חזרת על הקודם (אומנם מופיע בתמונה של "עכשיו הכל ביחד:" אבל נראלי כדי לשמור על המבניות שבחרת) ותודה, מעריכים את ההשקעה | ^u^ | / -_ \

תמונת המגיב

אש בתאריך: 06.07.2023

בהיר וברור

תמונת המגיב

אלי בתאריך: 21.06.2024

תודה רבה! מאוד מחכים!