כל מה שאתה צריך לדעת על Bash For Loops בלינוקס

כל מה שאתה צריך לדעת על Bash For Loops בלינוקס

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





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





כיצד פועלים סקריפטים של Bash

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





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

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



#!/bin/bash
echo 'Hello, World'

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

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

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





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

כיצד פועל לולאות

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





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

for (i = 0; i <100; i++) {
/* statements to execute repeatedly */
}

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

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

people = [ 'Peter', 'Paul', 'Mary' ]
foreach (people as person) {
if (person == 'Paul') {
...
}
}

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

people = [ 'Peter', 'Paul', 'Mary' ]
for (person in people) {
if (person == 'Paul') {
...
}
}

עבור ב- Loops

בשום אופן, הפורום - או ב - לולאה נפוצה יותר. התחביר הבסיסי הוא בפשטות:

for arg in [list]
do
/* statements to execute repeatedly */
/* the value of arg can be obtained using $arg */
done

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

שירי חג המולד הקלאסיים להורדה בחינם mp3
for file in one.c two.c three.c
do
ls '$file'
done

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

one.c
two.c
three.c

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

for file in *.xml
do
ls -l '$file'
done

להלן כמה פלט לדוגמא:

$ -rw-r--r-- 1 bobby staff 2436 3 Nov 2019 feed.xml
$ -rw-r--r-- 1 bobby staff 6447 27 Oct 16:24 sitemap.xml

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

$ ls -l *.xml

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

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

$ wc -l *.xml
44 feed.xml
231 sitemap.xml
275 total

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

for file in *.xml
do
wc -l $file
done

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

44 feed.xml
231 sitemap.xml

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

כאשר רשימה היא לא רשימה

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

for file in one.c two.c

לא כך:

for file in 'one.c two.c'

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

FILES='one.c two.c'
for file in $FILES
do
...
done

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

למי המספר הזה רשום

כי בלי רשימה

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

#!/bin/sh
for a
do
echo $a
done

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

$ ./args.sh one two three
one
two
three

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

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

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

for (( i=1; i<=5; i++ ))
do
echo $i
done

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

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

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

for i in {1..5}
do
echo $i
done

הרחבת הפלטה המתקיימת מתרגמת ביעילות את הלולאה לעיל ל:

for i in 1 2 3 4

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

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

#!/bin/bash
for file in *
do
if [ ! -f '$file' ]
then
echo '$file is not a file'
continue
fi
num_chars=$(wc -c <'$file')
echo $file is '$num_chars characters long'
if [ $num_chars -gt 100 ]
then
echo 'Found $file'
break
fi
done

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

סיכום

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

לַחֲלוֹק לַחֲלוֹק צִיוּץ אימייל האם כדאי לשדרג ל- Windows 11?

Windows עוצב מחדש. אבל האם זה מספיק כדי לשכנע אותך לעבור מ- Windows 10 ל- Windows 11?

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

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

עוד מאת בובי ג'ק

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

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

לחצו כאן להרשמה