שלום אורח התחבר

דף קיצורים ל Bash

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

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

1כותרת

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

#!/usr/bin/env bash
set -e
set noclobber

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

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

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

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

2משתנים

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

target_location=/usr/local
file_name=demo.mp3
full_path="$HOME/$FILE_NAME"
opts="-R"

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

files=$HOME/*.txt

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

echo "$file_name"

# Array length
echo "You have ${#files[*]} files"

# Array item by index
echo "The first is: ${files[1]}"

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

file=/home/ynon/demo.mp3
echo "$file Is /home/ynon/demo.mp3"

# cut prefix until the first dot
echo "${file#*.} is mp3"

# cut suffix until the first dot
echo "${file%.*} is /home/ynon/demo"

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

script_path="`realpath ${0%/*}`"

3תנאים

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

# if command
site=www.google.com

if httping -c 1 "$site" >& /dev/null
then
    echo "Website $site Responded. It's probably alive"
fi

# if condition
if [[ -f /etc/passwd ]]
then
    echo "path /etc/passwd is a file"
fi

4לולאות

ל bash יש תמיכה בלולאות for each ולולאות for קלאסיות:

# for each text file in my home directory
files=/home/ynon/*.txt
for f in files
do
    echo "$f"
    head -1 "$f"
    echo
done

# count from 2 till 20
for (( i=0; i <= 20; i++ ))
do
    echo $i
done

ובנוסף לולאות while נכתבות מאוד דומה לפקודות if. הלולאה הבאה למשל תחפש שם שאינו קיים לקובץ ותיצור קובץ בשם זה:

i=0
while [[ -f myfile_$i ]]
do
    (( i++ ))
done

echo "Found new name: myfile_$i"
touch myfile_$i

5פונקציות

בסקריפטים ארוכים ייתכן ותרצו להגדיר פונקציות שנוכל להשתמש בהן שוב ושוב. המילה function מגדירה פונקציה ב bash והמשתנים $1, $2, $3 וכן הלאה בתוך גוף הפונקציה מייצגים את המשתנים שהועברו לפונקציה:

function mcd {
    mkdir -p "$1"
    cd "$1"
}

# creates a new directory and cd to it
mcd demo

6מידע נוסף

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

האתר https://www.tutorialspoint.com/executebashonline.php מאפשר לכם לכתוב תוכניות bash ולהריץ מתוך הדפדפן כדי לשחק עם השפה.

רשימה מלאה של כל הפקודות והיכולות של bash אפשר למצוא באתר: https://tiswww.case.edu/php/chet/bash/bashref.html

וגם לנו באתר יש קורס וידאו בנושא bash עם המון דוגמאות מהחיים. קישור לקורס: https://www.tocode.co.il/bundles/bash-shell-scripts


נהניתם מהפוסט? מוזמנים לשתף ולהגיב