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

מנהלי מערכות לינוקס ו- Mac מכירים בדרך כלל סקריפטים דרך הטרמינל, אך אפילו משתמשי Windows יכולים היכנס לפעולה עם מערכת המשנה של Windows עבור Linux.

כיצד להשיג את מעטפת ה- Bash של לינוקס ב- Windows 10

צריך להשתמש בלינוקס אין זמן לעבור למחשב אישי אחר או להפעיל VM? הפעל את לינוקס ב- Windows 10 עם מסוף Bash shell במקום!

איך עובד סקריפטים של באש

סקריפט bash הוא פשוט קובץ טקסט רגיל המכיל סדרה של פקודות ש- shell bash יכול לקרוא ולבצע. Bash הוא מעטפת ברירת המחדל ב- MacOS לפני קטלינה, ורוב הפצות לינוקס.

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

ראשית, צור את הקובץ הבא במיקום נוח (באופן אידיאלי, פתח מסוף ונווט תחילה לספרייה הרצויה):

#! / bin / bash
הד "שלום עולם"

השורה הראשונה מספרת כל מה שמפעיל את התוכנית הזו כיצד להריץ אותה (כלומר באמצעות המתורגמן bash). השנייה היא פשוט פקודה כמו כל אחת אחרת שתוכל להזין בשורת הפקודה. שמור את הקובץ כ-

instagram viewer
שלום_עולם.ש, לאחר מכן:

$ chmod + x hello_world.sh
$ ./hello_world.sh

ה chmod הפקודה בשורה הראשונה הופכת את הקובץ להפעלה, כלומר ניתן להריץ על ידי הקלדת שמו, כמו בשורה השנייה.

אם אתה רואה את המילים "שלום עולם" מודפסות בשורה במסוף שלך, אז הכל עובד כנדרש.

איך לולאות עובדות

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

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

עבור (i = 0; אני <100; i ++) {
/ * הצהרות לביצוע שוב ושוב * /
}

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

לולאות Foreach, לעומת זאת, נוטות לפעול על מבנים כמו רשימות או מערכים, ומטפלות בכל פריט בתוך אותו אוסף:

אנשים = ["פיטר", "פול", "מרי"]
foreach (אנשים כאדם) {
אם (אדם == "פול") {
...
}
}

יש שפות המשתמשות בתחביר שונה במקצת המחליף את סדר האוסף והפריט:

אנשים = ["פיטר", "פול", "מרי"]
עבור (אדם באנשים) {
אם (אדם == "פול") {
...
}
}

שכן בלולאות

בבאש, הקדמה - או ב—לולאה נפוצה יותר. התחביר הבסיסי הוא בפשטות:

עבור ארג ב [רשימה]
לַעֲשׂוֹת
/ * הצהרות לביצוע שוב ושוב * /
/ * ניתן להשיג את הערך של arg באמצעות $ arg * /
בוצע

לדוגמה, לחזור באמצעות שלושה קבצים בעלי שם מפורש:

לקובץ ב- one.c two.c three.c
לַעֲשׂוֹת
ls "$ file"
בוצע

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

one.c
two.c
שלוש.ג

במקום קבוצה קבועה של קבצים, ניתן להשיג את הרשימה באמצעות תבנית גלוב (אחת הכוללת תווים כלליים - תווים מיוחדים המייצגים תווים אחרים). בדוגמה הבאה, לולאת ה- for חוזרת על כל הקבצים (בספרייה הנוכחית) ששמם מסתיים ב- ".xml":

לקובץ ב- * .xml
לַעֲשׂוֹת
ls -l "קובץ $"
בוצע

הנה כמה דוגמאות לפלט:

$ -rw-r - r-- 1 צוות בובי 2436 3 בנובמבר 2019 feed.xml
$ -rw-r - r-- 1 צוות בובי 6447 27 באוקטובר 16:24 sitemap.xml

זה עשוי להיראות מאוד כמו דרך ארוכת רוח:

$ ls -l * .xml

אבל יש הבדל משמעותי: ה- for loop מבצע את ה- ls לתכנן 2 פעמים נפרדות, כשכל פעם מועבר אליו שם קובץ יחיד. בדוגמה ls הנפרדת, תבנית הגלוב (* .xml) תואמת תחילה את שמות הקבצים ואז שולחת את כולם, כפרמטרים של שורת פקודה, למופע אחד של ls.

הנה דוגמה המשתמשת ב- שירותים (ספירת מילים) תוכנית כדי להפוך את ההבדל לברור יותר:

$ wc -l * .xml
44 feed.xml
231 sitemap.xml
275 סה"כ

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

לקובץ ב- * .xml
לַעֲשׂוֹת
קובץ wc -l $
בוצע

עדיין תראה את המספר עבור כל קובץ:

44 feed.xml
231 sitemap.xml

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

כאשר רשימה אינה רשימה

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

לקובץ ב- one.c two.c

לא כך:

לקובץ ב- "one.c two.c"

הדוגמא השנייה כוללת שמות קבצים במרכאות כפולות המביאות רשימה עם פרמטר יחיד בלבד; לולאת ה- for תבוצע רק פעם אחת. ניתן להימנע מבעיה זו באמצעות משתנה במקרים כאלה:

FILES = "one.c two.c"
לקובץ ב- $ FILES
לַעֲשׂוֹת
...
בוצע

שים לב שהכרזת המשתנה עצמה אכן צריכה לכלול את ערכה במרכאות כפולות!

עבור בלי רשימה

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

#! / bin / sh
למשך
לַעֲשׂוֹת
מהדהד $ א
בוצע

ואז ביצוע args.sh ייתן לך את הדברים הבאים:

$ ./args.sh אחד שתיים שלוש
אחד
שתיים
שְׁלוֹשָׁה

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

חיקוי מספר מסורתי לולאה

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

עבור ((i = 1; אני <= 5; i ++))
לַעֲשׂוֹת
מהדהד $ i
בוצע

זוהי הצורה הקלאסית עם שלושה חלקים שבהם:

  1. משתנה מאותחל (i = 1) כאשר נתקלים לראשונה בלולאה
  2. הלולאה נמשכת כל עוד התנאי (i <= 5) נכון
  3. בכל פעם סביב הלולאה, המשתנה מצטבר (i ++)

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

עבור אני ב {1..5}
לַעֲשׂוֹת
מהדהד $ i
בוצע

הרחבת הסד המתרחשת ביעילות את האמור לעיל לולאה ל:

עבור i ב 1 2 3 4

בקרת לולאה דקה יותר עם הפסקה והמשך

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

#! / bin / bash
לקובץ *
לַעֲשׂוֹת
אם [! -f "$ file"]
לאחר מכן
הד "קובץ $ אינו קובץ"
לְהַמשִׁיך
fi
num_chars = $ (wc -c הקובץ של הד $ הוא "$ num_chars תווים"
אם [$ num_chars -gt 100]
לאחר מכן
הד "נמצא קובץ $"
לשבור
fi
בוצע

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

סיכום

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

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

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

נושאים קשורים
  • תִכנוּת
  • לינוקס
על הסופר
בובי ג'ק (19 מאמרים פורסמו)

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

עוד מבובי ג'ק

הירשם לניוזלטר שלנו

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

צעד אחד נוסף !!!

אנא אשר את כתובת הדוא"ל שלך בדוא"ל ששלחנו לך זה עתה.

.