איך לכתוב Shell Script

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

1. מתי נרצה לכתוב Shell Script

Shell Script מהווה דרך קלה לביצוע אוטומציה של תהליכים פשוטים בסביבת יוניקס. הרעיון — במקום לכתוב כל פעם את אותו רצף פקודות, ניתן לקבץ את כולן יחד לקובץ אחד (שיקרא מעתה הסקריפט). מכאן ואילך נוכל להריץ את הסקריפט, מה שיוביל להרצה של כל הפקודות בקובץ שורה אחר שורה. 

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

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

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


<?xml version="1.0"?>
<host>
  <name>my laptop</name>
  <home>/home/ynon</home>
  <folder>/home/ynon/tmp/demos/test</folder>
</host>
 

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

2. כללים לכתיבת סקריפט

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

1. לקובץ הרשאת הפעלה (כדי שנוכל להשתמש בו)
2. השורה הראשונה בקובץ מציינת לאיזה Shell הוא נכתב

כך נראה ה Shell Script הראשון שלנו:


#!/usr/bin/env bash
#
# test.sh
# Copyright (C) 2014 ynonperek <ynonperek@ynons-air>
#
# Distributed under terms of the MIT license.
#

echo Hello World


שימו לב לשורה הראשונה המפנה ל bash. 

כדי להפעילו ניתן לו הרשאות הרצה עם הפקודה:


chmod +x demo.sh

ונפעיל עם:


./demo.sh

3. קבלת מידע מהמשתמש

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


./demo.sh test-folder

נוכל לגשת למשתנה הראשון שהגיע משורת הפקודה באמצעות המשתנה $1 (וכמו שתיארתם לעצמכם, למשתנה השני נוכל לגשת באמצעות המשתנה $2 וכן הלאה). 

4. יצירת התיקייה והקובץ בתוכה

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


#!/usr/bin/env bash
#
# test.sh
# Copyright (C) 2014 ynonperek <ynonperek@ynons-air>
#
# Distributed under terms of the MIT license.
#

mkdir $1
cd $1

cat <<END > data.xml
<host>
  <name>`hostname`</name>
  <home>$HOME</home>
  <folder>`pwd`</folder>
</host>
END


בתוך מסמך טמפלייט, Bash מבצע שערוך של כל הערכים כאילו נכתבו בשורת הפקודה, ולכן השורות האחרונות יכתבו את מסמך ה XML עם התאמה של השדות. כל פקודה שנמצאת בתוך `…` תבוצע והפלט שלה יחליף את הטקסט, וכל משתנה (למשל $HOME) ישוערך ויוחלף בערך שלו.

ההפניה בשורת ה cat גורמת לכתיבת הפלט לתוך הקובץ data.xml.

5. סיכום

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


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


#!/usr/bin/env bash
#
# test.sh
# Copyright (C) 2014 ynonperek <ynonperek@ynons-air>
#
# Distributed under terms of the MIT license.
#

mkdir $1
cd $1

cat <<END > data.xml
<host>
  <name>`hostname`</name>
  <home>$HOME</home>
  <folder>`pwd`</folder>
</host>
END