- פונקציות מאפשרות לך לכלול בלוקים של קוד כדי למנוע יתירות ולשפר את הקריאות של סקריפטים.
- חיוני לנהל את היקף המשתנים באמצעות מילת המפתח המקומית כדי למנוע התנגשויות עם הסביבה הגלובלית.
- החזרת ערכים ב-Bash מוגבלת למצב יציאה (0-255), מה שמחייב שימוש ב-echo או משתנים כדי להחזיר נתונים מורכבים.
- מודולריזציה באמצעות פקודת source מאפשרת שימוש חוזר בפונקציות על פני קבצי מערכת מרובים.
כשמתחילים לכתוב סקריפטים של Bash, זה נורמלי שהכל נראה פשוט בהתחלה, אבל מגיעה נקודה שבה הקוד הופך לבלגן של ממש. אם שמתם לב שאתם מעתיקים ומדביקים את אותם קטעי פקודות שוב ושוב, הגיע הזמן לעשות את הקפיצה לפונקציות. בעיקרון, פונקציה היא כמו סקריפט קטן בתוך סקריפט אחר המאפשר לכם לתת שם לקבוצת הוראות כדי שתוכלו לקרוא להן מתי שתרצו.
זה לא רק עניין של חיסכון בזמן הקלדה, אלא של אימוץ נוהג מקצועי. על ידי הימנעות מחזרה על קוד, אתם מפחיתים באופן דרסטי את הסיכוי לטעויות, ומעל הכל, הופכים את התחזוקה להרבה יותר קלה. אם אתם צריכים לשנות כלל עסקי או לתקן באג, אתם צריכים לעשות זאת רק במקום אחד במקום לחפש בכל הקובץ היכן חזרתם על זה.
כיצד להכריז על פונקציות ב-Bash
כדי לבצע פונקציה, Bash מציעה מספר דרכים לעשות זאת, כך שתוכלו להשתמש בכל דרך שתבחרו. הדרך הנפוצה והמועדפת ביותר היא לכתוב את שם הפונקציה ואחריו סוגריים. לדוגמה: mi_funcion() { comandos; }יש גם תחביר מפורש יותר המשתמש במילה השמורה פונקציה לפני השם, למרות שפחות נפוץ למצוא אותו בכתב יד מודרני.
אם אתם ממהרים ורוצים להגדיר הכל בשורה אחת, אתם יכולים לעשות זאת, אבל שימו לב לרווחים! חיוני להשאיר רווח. רווח אחרי מקש הפתיחה ולפני משפט הסיום, בנוסף להפרדת פקודות פנימיות באמצעות נקודה-פסיק. לדוגמה: nombre() { echo "Hola"; echo "Mundo"; }אם תשכחו את הפרטים האלה, בש יתלונן והתסריט לא יתחיל.
נקודה מרכזית שאסור להתעלם ממנה היא שהצהרת פונקציה לא אומרת שהיא תבוצע אוטומטית. כדי שהקוד בתוך הסוגריים המתולתלים יתעורר לחיים, עליכם לקרוא לפונקציה בשמה בגוף הסקריפט. כמו כן, זכרו תמיד להגדיר את הפונקציה לפני שתנסו להשתמש בה ; אם תקראו לה לפני ההצהרה עליה, המעטפת לא תדע על מה אתם מדברים ותזרוק שגיאה.
משחק המשתנים: היקף גלובלי ומקומי
כאן אנשים רבים מתבלבלים. כברירת מחדל, ב-Bash, כל משתנה שתיצרו הוא גלובלי . משמעות הדבר היא שאם תגדירו משתנה בתוך פונקציה, הוא ימשיך להתקיים וישמור על ערכו מחוץ לפונקציה, דבר שעלול להשפיע על חלקים אחרים של התוכנית. זה יכול להיות שימושי, אך בסקריפטים גדולים, זה לרוב מתכון לאסון.
כדי להימנע מהפתעות אלו, יש את מילת המפתח `local` . על ידי הצהרת משתנה כ-`local` בתוך פונקציה, אתם מבטיחים שהוא גלוי וניתן לשינוי רק בתוך בלוק קוד זה. אם יש לכם משתנה גלובלי ומשתנה מקומי בעל אותו שם, המשתנה המקומי יקבל עדיפות כשהוא בתוך הפונקציה, אך לאחר סיום הפונקציה, המשתנה הגלובלי יחזור לערכו המקורי, ללא שינוי.
העברת ארגומנטים לפונקציות
פונקציות לא חייבות להיות סטטיות; הן יכולות לקבל נתונים כדי לעבד מידע שונה בכל פעם שהן נקראות. כדי להעביר ארגומנטים, פשוט כתבו אותם אחרי שם הפונקציה, מופרדים ברווחים. בתוך הפונקציה, תוכלו לגשת אליהן באמצעות משתני מיקום כמו $1, $2, וכו '
חשוב להבחין שמשתנים אלה אינם תלויים בארגומנטים המתקבלים על ידי הסקריפט הראשי. בעוד ש $0 תמיד מתייחס ל שם הסקריפט, המשתנים מ $1 למעלה $9 בתוך פונקציה, אלה מתייחסים ספציפית לפרמטרים המועברים לפונקציה זו. בנוסף, יש לנו כלים שימושיים כגון $# כדי לברר כמה טיעונים התקבלו או $@ כדי להתייחס לרשימת הפרמטרים המלאה.
הדילמה של החזרת ערכים
בניגוד לשפות כמו פייתון או ג'אווה, פונקציות בש אינן מחזירות ערכים במובן המסורתי. מה שהמשפט מחזיר return הוא סטטוס יציאה, מספר שלם בין 0 ל-255. על פי המוסכמה, 0 מציין שהכל הלך בצורה חלקה (הצלחה) וכל מספר אחר מייצג קוד שגיאה.
אם אתם צריכים לאחזר את תוצאת החישוב או טקסט כלשהו, יש לכם שתי אפשרויות עיקריות. הראשונה היא להשתמש במשתנה גלובלי לאחסון התוצאה, אם כי זו אינה הגישה הנקייה ביותר. האפשרות האלגנטית יותר היא להשתמש הפלט הסטנדרטי באמצעות הפקודה echo o printf וללכוד את התוצאה מבחוץ באמצעות החלפת פקודות: resultado=$(mi_funcion)בדרך זו, הערך המודפס על ידי הפונקציה נשמר ישירות במשתנה.
שימוש חוזר ורקורסיה מתקדמים
אחת היתרונות של Bash היא היכולת לארגן פונקציות בקבצים נפרדים. אם יש לכם סט כלים שאתם משתמשים בו בסקריפטים רבים, תוכלו לשמור אותם בקובץ (לדוגמה, utils.shולטעון אותם לתוך כל סקריפט אחר באמצעות הפקודה מָקוֹר (או הנקודה) .פעולה זו ממירה את הפונקציות שלך לפקודות הזמינות בתהליך הנוכחי, וממטבת את זמן הפיתוח.
עבור הנועזים יותר, ישנן פונקציות רקורסיביות , שהן פונקציות שקוראות לעצמן. הן אידיאליות לפתרון בעיות שניתן לחלק לתת-משימות זהות, כמו חישוב פקטוריאל. המפתח כאן הוא תמיד להגדיר מקרה בסיס ; אחרת, הפונקציה תקרא לעצמה ללא סוף עד שהמערכת תיגמר לה המשאבים והסקריפט קורס.
שליטה בשימוש בפונקציות מאפשרת לך להפוך סקריפטים ליניאריים ומייגעים לכלים מודולריים שקלים לקרוא ולתחזק. החל מהצהרה נכונה וניהול חכם של טווח משתנים, ועד לשימוש ברקורסיה וייבוא ספריות חיצוניות דרך קוד מקור, יכולות אלו הופכות את מעטפת ה-Bash לסביבת אוטומציה חזקה ביותר עבור כל מנהל מערכת או מפתח.