הגדרת משתנים ב Bash

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

1. הקדמה

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

מספר נקודות לזכור לגבי משתנים ב Bash:

  1. אין צורך להגדיר משתנה לפני השימוש. משתנה שלא הוגדר מקבל את הערך הריק (מחרוזת ריקה).
  2. משתנה הוא תמיד מטיפוס מחרוזת.
  3. סימן ה-$ אינו חלק משם המשתנה, הוא פשוט הסימן שגורם ל Bash להחליף מחרוזת בערך משתנה.
  4. שמות משתנים יכולים להכיל אותיות, מספרים וקו-תחתון. שם משתנה לא יכול להתחיל במספר.

 

2. הגדרת משתנים והצבת ערכים

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

להלן מספר דוגמאות:


EMAIL=ynon@ynonperek.com
name=“Ynon Perek"

COUNT=20

TEXT=“$name likes unix”

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


# Save entire content of file /etc/shells to variable CONTENT
CONTENT=$(cat /etc/shells)

# save the number of files and directories in currenct folder
# to variable NUM_FILES
NUM_FILES=$(ls -l|tail +2|wc -l)

# Save number of lines in file /etc/passwd to variable LINES_IN_FILE
LINES_IN_FILE=$(cat /etc/passwd | wc -l)

 

3. שערוך משתנים

את הרעיון הבסיסי של שימוש במשתנים אתם כבר מכירים: שימו $ לפני שם המשתנה ו Bash ישערך את המשתנה. בהנחה שהגדרתם את המשתנים כמו בסעיף הקודם, להלן כמה דוגמאות:


# print the value of a variable next to other text
$ echo my email is $EMAIL
$ cowsay I have $NUM_FILES files

# Make a new file named "copy" from the value of a variable
$ echo $CONTENT > copy

 

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


$ FRUIT=apple

# Surprise! prints “get me some"
# because the variable FRUITs is not defined
$ echo get me some $FRUITs 

# this one works and prints: "get me some fruits"
$ echo get me some ${FRUIT}s

 

4. פעולות על משתנים

Bash מספק מספר אופרטורים לביצוע פעולות החלפה טקסטואליות פשוטות על ערכי משתנים— פעולות כמו מחיקת תחילית משותפת או שינוי סיומת. קחו לדוגמא את המשתנה הבא שמייצג שם קובץ:


$ FILE="/home/music/wish you were here.mp3"

בנוסף לשליפת ערך המשתנה באופן רגיל באמצעות התחילית $, ניתן לשלוף ערכים נוספים המבוססים על ערך המשתנה. עבור משתנה שמייצג שם קובץ, אולי נרצה לשלוף רק את התיקייה בה נמצא הקובץ או רק את הסיומת שלו. ב Bash קיימים מספר אופרטורים לשליפת ערכים המבוססים על תוכן המשתנה לפי הטבלא הבאה:

ערכים נגזרים
כתיב ערך הסבר
${FILE#/home/music} wish you were here.mp3 ניתן לכתוב תחילית אחרי סימן ה-# ואז נקבל את ערך המשתנה ללא אותה תחילית
${FILE%/*.mp3} /home/music ניתן לכתוב סיומת אחרי סימן % ולקבל את ערך המשתנה ללא הסיומת
${FILE/mp3/wav} /home/music/wish you were here.wav ניתן להשתמש בסימן / כדי לקבל את ערך המשתנה עם מחרוזת אחת מוחלפת במחרוזת אחרת
${FILE##*/} wish you were here.mp3 סימן ## מחזיר את ערך המשתנה ללא התחילית המקסימלית שמתאימה לתבנית
${FILE%% *} /home/music/wish סימן %% מחזיר את ערך המשתנה ללא הסיפא הארוכה ביותר המתאימה לתבנית
${FILE// /_} /home/music/wish_you_were_here.mp3 סימן // מחליף את כל המופעים של מחרוזת נתונה במחרוזת החלפה

 

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