מדריך למתחילים - תנאים ומשתנים

מבוא

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

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

תוכל לראות את שני המדריכים הראשונים על ידי ביקור בכתובת:

אם אתה חדש ב BASH scripting אני ממליץ לקרוא את שני המדריכים הראשונים לפני שתמשיך עם זה.

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

התקן rsstail

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

אם אתה משתמש בסוג ההפצה מבוסס דביאן / אובונטו / מנטה , הבא:

sudo apt-get להתקין rsstail

עבור Fedora / CentOS וכו 'הקלד את הדברים הבאים:

yum להתקין

עבור openSUSE הקלד את הדברים הבאים:

להתקין

הצהרת IF

פתח מסוף וצור קובץ בשם rssget.sh על ידי הקלדת הדברים הבאים:

סנו ננו rssget.sh

בתוך עורך nano הזן את הטקסט הבא:

#! / bin / bash
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;

שמור את הקובץ על-ידי הקשה על CTRL ו- O ולאחר מכן על-ידי הקשה על CTRL ו- X.

הפעל את התסריט על ידי הקלדת הפרטים הבאים:

sh rssget.sh

הסקריפט יחזיר רשימה של כותרות מתוך עדכון ה- RSS של linux.about.com.

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

פתח את הסקריפט rssget.sh בננו שוב וערוך את הקובץ כך:

#! / bin / bash

אם [$ 1 = "verbose"]
לאחר מכן
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
Fi

הפעל את הסקריפט שוב ​​על ידי הקלדת הפרטים הבאים:

sh rsget.sh verbose

הפעם הזנת RSS חוזר עם כותרת, קישור ותיאור.

בואו ננתח את הסקריפט בפירוט:

#! / Bin / bash מופיע בכל סקריפט שאנו כותבים. השורה הבאה בעצם מסתכלת על פרמטר הקלט הראשון שסופק על ידי המשתמש ומשווה אותו למילה "verbose". אם פרמטר הקלט והמילה "verbose" מתאימים את השורות בין אז ל - Fi רץ.

התסריט הנ"ל הוא ללא ספק פגום. מה קורה אם לא מספקים פרמטר קלט בכלל? התשובה היא שאתה מקבל שגיאה לאורך השורה של מפעיל לא צפוי.

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

השתמש nano שוב כדי לערוך את הקובץ rssget.sh ולשנות את הקוד כדלקמן:

#! / bin / bash

אם [$ 1 = "verbose"]
לאחר מכן
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
אַחֵר
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
Fi

שמור את הקובץ והפעל אותו על ידי הקלדת הפרטים הבאים:

sh rsget.sh verbose

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

sh כותרות rssget.sh

הפעם מופיעה רק רשימה של כותרים.

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

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

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

עריכת סקריפט rssget.sh שלך כדי לראות את הדברים הבאים:

#! / bin / bash

אם [$ 1 = "הכל"]
לאחר מכן
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "תיאור"]
לאחר מכן
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

אַחֵר
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
Fi

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

עכשיו התסריט עובד כדלקמן. אם אתה מפעיל sh rssget.sh כל אז אתה מקבל תיאורים, קישורים ותארים. אם במקום זה אתה פשוט לרוץ ש rssget.sh תיאור אתה רק מקבל כותרות ותיאורים. אם אתה מספק כל מילה אחרת תקבל רשימה של כותרים.

זה מציג דרך להגיע במהירות עם רשימה של הצהרות מותנה. דרך חלופית לעשות ELIF היא להשתמש במה שמכונה הצהרות IF מקוננות.

להלן דוגמה המציגה כיצד הצהרות IF מקוננות פועלות:

#! / bin / bash

אם [$ 2 = "aboutdotcom"]
לאחר מכן
אם [$ 1 = "הכל"]
לאחר מכן
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "תיאור"]
לאחר מכן
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

אַחֵר
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
Fi
אַחֵר
אם [$ 1 = "הכל"]
לאחר מכן
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "תיאור"]
לאחר מכן
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
אַחֵר
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
Fi
Fi

אתה מוזמן להקליד את כל זה אם אתה אוהב או להעתיק ולהדביק אותו לקובץ rssget.sh שלך.

התסריט לעיל מציג פרמטר 2 אשר מאפשר לך לבחור או "about.com" או "lxer.com" עדכון RSS.

כדי להפעיל אותו אתה מקליד את הדברים הבאים:

sh rssget.sh כל aboutdotcom

אוֹ

sh rssget.sh כל lxer

אתה יכול כמובן להחליף את כל עם תיאורים או כותרות לספק רק תיאורים או רק כותרות.

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

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

תארו לעצמכם שרציתם להוסיף עדכון RSS נוסף כגון User Everyday Linux או Linux Today? התסריט יהפוך ענק ואם תחליט שאתה רוצה את ההצהרה הפנימית IF לשנות אתה צריך לשנות את זה במספר מקומות.

אמנם יש זמן ומקום עבור IF מקוננות הם צריכים לשמש במשורה. בדרך כלל יש דרך refactor הקוד שלך, כך שאתה לא צריך את IF מקוננות בכלל. אני אגיע לנושא זה במאמר עתידי.

בואו נסתכל עכשיו על תיקון הבעיה של אנשים הזנת פרמטרים duff. לדוגמה בתסריט לעיל אם המשתמש מזין משהו אחר מאשר "aboutdotcom" כמו הפרמטר השני ואז רשימה של מאמרים להופיע מתוך הזנת RSS מ LXER ללא קשר אם המשתמש להזין lxer או לא.

בנוסף, אם המשתמש אינו מזין את "all" או "description" כפרמטר 1 אז ברירת המחדל היא רשימה של כותרות אשר יכול או לא להיות מה המשתמש התכוון.

תסתכל על התסריט הבא (או להעתיק ולהדביק אותו לקובץ rssget.sh שלך.

#! / bin / bash

אם [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"]
לאחר מכן
אם [$ 1 = "all"] || [$ 1 = "תיאור"] || [$ 1 = "כותרת"]
לאחר מכן
אם [$ 2 = "aboutdotcom"]
לאחר מכן

אם [$ 1 = "הכל"]
לאחר מכן
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "תיאור"]
לאחר מכן
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

אַחֵר
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
Fi
אַחֵר
אם [$ 1 = "הכל"]
לאחר מכן
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "תיאור"]
לאחר מכן
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
אַחֵר
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
Fi
Fi
Fi
Fi

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

הקטע החשוב בתסריט זה הוא משפט IF הצהרה על סעיף 2 בשורה 4.

|| מייצג OR. אז השורה אם [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"] בודק אם הפרמטר השני שווה ל "aboutdotcom" או "lxer". אם זה לא אז ההצהרה IF הושלמה כי אין עוד הצהרה החיצוני ביותר IF.

בדומה לקו 4 אם הקו [$ 1 = "all"] || [$ 1 = "תיאור"] || [$ 1 = "title"] בודק אם הפרמטר 1 שווה ל "all" או "description" או "title".

עכשיו אם המשתמש מריץ rssget.sh sh תפוחי אדמה גבינה שום דבר מוחזר ואילו לפני שהם היו מקבלים רשימה של כותרות מ LXER.

ההפך מ | | J && האופרטור & && מייצג ו.

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

#! / bin / bash

אם [$ # -eq 2]
לאחר מכן

אם [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"]
לאחר מכן
אם [$ 1 = "all"] || [$ 1 = "תיאור"] || [$ 1 = "כותרת"]
לאחר מכן
אם [$ 2 = "aboutdotcom"]
לאחר מכן

אם [$ 1 = "הכל"]
לאחר מכן
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "תיאור"]
לאחר מכן
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

אַחֵר
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
Fi
אַחֵר
אם [$ 1 = "הכל"]
לאחר מכן
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "תיאור"]
לאחר מכן
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
אַחֵר
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
Fi
Fi
Fi
Fi
Fi

הקטע היחידי המופיע בתסריט זה הוא עוד משפט IF חיצוני כדלקמן: אם [$ # -eq 2] . אם אתה קורא את המאמר על פרמטרים קלט תוכלו לדעת כי # $ מחזירה את המספר של מספר פרמטרים קלט. -Eq עומד שווה. ההצהרה IF ולכן בודק שהמשתמש נכנס 2 פרמטרים ואם הם לא זה פשוט יוצא מבלי לעשות שום דבר. (לא ידידותי במיוחד).

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

הפקודה האחרונה שאתה צריך ללמוד על הצהרות מותנה היא הצהרה CASE.

#! / bin / bash


אם [$ # -eq 2]
לאחר מכן
מקרה $ 2 ב
aboutdotcom)
מארז $ 1 ב
את כל)
rsstail -d -l -u z.about.com/6/o/m/linux_p2.xml
;
תיאור)
rsstail -d -u z.about.com/6/o/m/linux_p2.xml
;
כותרת)
rsstail -u z.about.com/6/o/m/linux.about.com/6/o/m/linux_p2.xml
;
esac
;
lxer)
מארז $ 1 ב
את כל)
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
;
תיאור)
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
;
כותרת)
rsstail -u http://lxer.com/module/newswire/headlines.rss
;
esac
;
esac
Fi

ההצהרה במקרה היא דרך יפה יותר של כתיבה אם אחרת אם אחרת אם אחרת.

לדוגמה, ההיגיון הזה

אם פירות = בננות
ואז זה
ELSE אם פירות = תפוזים
ואז זה
ELSE אם פירות = ענבים
ואז זה
END IF

ניתן לכתוב מחדש כמו:

מקרה פירות ב
בננות)
תעשה את זה
;
תפוזים)
תעשה את זה
;
ענבים)
תעשה את זה
;
esac

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

בסקריפט rssget.sh הצהרת המקרה מסירה חלק מהקינון הנורא הזה, אם כי לא ממש משפרת אותו מספיק.

כדי לשפר באמת את התסריט אני צריך להכיר לך משתנים.

עיין בקוד הבא:

#! / bin / bash

lxer = "lxer.com/module/newswire/headlines.rss"
aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"
הצג = ""
url = ""

אם [$ # -lt 2] || [$ # -gt 2]
לאחר מכן
echo "use: rssget.sh [הכל | תיאור | title] [aboutdotcom | lxer]";
יְצִיאָה;
Fi

מארז $ 1 ב
את כל)
הצג = "- d -l -u"
;
תיאור)
הצג = "- d -u"
;
כותרת)
הצג = "- u"
;
esac

מקרה $ 2 ב
aboutdotcom)
url = $ aboutdotcom;
;
lxer)
url = $ lxer;
;
esac
rsstail $ $ url להציג;

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

lxer = "lxer.com/module/newswire/headlines.rss"
aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"
הצג = ""
url = ""

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

משתנה התצוגה מוגדר כעת בהתאם לבחירת כל, תיאור או כותרת ומשתנה של url מוגדר לערך המשתנה aboutdotcom או לערך המשתנה lxer, תלוי אם בחרת aboutdotcom או lxer.

הפקודה rsstail עכשיו רק צריך להשתמש בערך של תצוגה וכתובת האתר לפעול כראוי.

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

להלן התסריט הסופי עבור הדרכה זו.

#! / bin / bash

lxer = "lxer.com/module/newswire/headlines.rss"
aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"
dailylinuxuxuser = "http://feeds.feedburner.com/everydaylinuxuser/WLlg"
linuxtoday = "http://feedproxy.google.com/linuxtoday/linux"
שימוש = "שימוש: rssget.sh [הכל | תיאור | כותרת] [lxer | aboutdotcom |
הצג = ""
url = ""

אם [$ # -lt 2] || [$ # -gt 2]
לאחר מכן
echo $ שימוש;
יְצִיאָה;
Fi

מארז $ 1 ב
את כל)
הצג = "- d -l -u"
;
תיאור)
הצג = "- d -u"
;
כותרת)
הצג = "- u"
;
*)
echo $ שימוש;
יְצִיאָה;
;
esac

מקרה $ 2 ב
aboutdotcom)
url = $ aboutdotcom;
;
lxer)
url = $ lxer;
;
linuxtoday)
url = $ linuxtoday;
;
everydaylinuxuser)
url = $ everydaylinuxuser;
;
*)
echo $ שימוש;
יְצִיאָה;
esac

rsstail $ $ url להציג;

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

סיכום

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

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

בדוק את הדרך כיצד (גלול למטה על פני הקטגוריות כדי לראות רשימה של מאמרים) קטע של lux.about.com l כדי למצוא מדריכים שימושיים נוספים מאתחול כפול של Windows ו- Ubuntu כדי להגדיר מכונה וירטואלית באמצעות תיבות GNOME .