חידון: שליטה ב-Bash וב-Shell
אתה יודע לדבר עם מחשבים? באמת?
בחנו את כישורי כתיבת הסקריפטים ב‑Bash שלכם עם 16 השאלות האלה!
מכסה משתנים, לולאות, תנאים, מניפולציית מחרוזות, פונקציות ומלכודות תחביר מרמה בסיסית עד טריקית.
חדדו (או הוכיחו) את כישורי כתיבת הסקריפטים ב‑shell שלכם!
איך מגדירים משתנים ב-Bash?
משתנים ב-Bash מוצהרים ללא רווחים סביב סימן =. לדוגמה:
name=Aliceפעולה זו משייכת את הערך "Alice" למשתנה name.
הערה: $name משמש להתייחסות או לקריאת ערך המשתנה.
הוספת רווחים גורמת ל-shell לפרש את הפקודה כתוכנית להרצה, וזה לא מה שאתה רוצה כשאתה מגדיר משתנה.
כמו כן, Bash רגיש לאותיות רישיות, כך ש-name, NAME ו-Name הם משתנים שונים.
לבסוף, משתנים לא יכולים להכיל רווחים או מקפים (-) בשמותיהם. השתמש בקו תחתון (_) או ב-camelCase במקום.
מה ידפיס It's 🔨 Time!?
אני יודע. זה מטורף כמה מהר בריחה הופכת מחרוזות לקשות לפענוח. דמיין בריחה משפות אחרות במחרוזות Bash - עם כל המרכאות, האפוסטרופים וסמלי $ שמבלבלים אותך. 🫠
גרש בודד אינו יכול להופיע בתוך מחרוזת Bash המוקפת בגרשיים בודדים, גם לא עם לוכסן אחורי. צריך לסגור את המקטע המצוטט, לכתוב גרש עם תו מילוט מחוץ לו, ואז לפתוח שוב מקטע מצוטט. הרצף של סגירת מרכאה, מרכאה מוברחת, פתיחת מרכאה ('\'') מאפשר פלט של:
It's 🔨 Time!יש דרכים אחרות לטפל בזה, אבל זו הנפוצה ביותר.
בהנחה שלא הועברו ארגומנטים ו־$1 אינו מוגדר, מה יודפס?
price="$100"echo "Cost: $price"למשתנים ממוספרים יש משמעות מיוחדת. במקרה זה, $1 הוא משתנה מיוחד שמחזיק את הארגומנט הראשון שהועבר לסקריפט או לפונקציה.
מכיוון שאנחנו מריצים את הסקריפט ב-REPL, אין ארגומנטים, ולכן $1 ריק. הטקסט הנותר 00 מודפס כפי שהוא.
כדי להדפיס תו $ מילולי, השתמש בגרשיים בודדים, או ברוח ממנו עם לוכסן אחורי (\):
price="\$100"echo "Cost: $price"איך אפשר לקבל את האורך של משתנה ב-Bash?
התחביר ${#username} מחזיר את האורך של username.
לדוגמה:
username="@justsml"echo ${#username} # => 8למרות ש-wc יעבוד, מבחינה טכנית זה לא חלק מ-Bash.
הכלי wc הוא בדיחה פנימית ישנה שמתייחסת ל”ארון מים” או לשירותים.
צוחק! מישהו בכלל קורא את זה?
במציאות, wc היא פקודה עתיקה מ-Posix (ומימי AT&T Unix). זה קיצור של “word count” והיא יכולה לספור שורות, מילים ותווים בקובץ או בזרם קלט.
מה הפלט של הסקריפט אם הקובץ cats.txt קיים?
if [ -e cats.txt]; then echo "File exists"else echo "File does not exist"fiהאם שמת לב לרווח החסר לפני הסוגר הסוגר?
Bash רגיש מאוד כאן: נדרשים רווחים בתוך ביטויי סוגריים.
בגלל שהרווח החסר גורם לפקודת [ לא לראות סוגר סוגר ], Bash מדפיס אבחון, מתייחס לבדיקה כנכשלת, וממשיך לענף else.
התחביר הנכון הוא:
if [ -e example.txt ]; then echo "File exists"else echo "File does not exist"fiהערה: סוגריים כפולים [[ ]] מומלצים לביטויי תנאי. ראה BashFAQ.
איך אפשר להשוות מחרוזות בבאש?
cat1="Rosie"cat2="Sunflower"if [ "$cat1" === "$cat2" ]; then echo "Same cat"else echo "Different cats"fiעוד שגיאת תחביר של בדיקה!
תפסת את האופרטור === הלא חוקי?
אולי חשבת על JavaScript…
עם [ ... ], באש מדווחת על אבחון והתנאי הוא false, אז ענף else מדפיס Different cats. בבאש, השתמש ב-= או == להשוואות שוויון.
מה הפלט של הסקריפט הזה?
function greet () { echo "$1"}greet Hi Danפונקציות ב-Bash יכולות לקבל ארגומנטים. המשתנה $1 מכיל את הארגומנט הראשון שהועבר לפונקציה.
זכרו, $0 הוא שם הסקריפט, $1 הוא הארגומנט הראשון, $2 הוא השני, וכן הלאה. רווחים מפרידים בין ארגומנטים. לכן, greet Hi Dan מעביר את "Hi" כארגומנט הראשון. כדי להעביר את "Hi Dan" כארגומנט יחיד, יש להקיף אותו במרכאות: greet "Hi Dan".
מה עושה ה-: בסקריפט הזה?
rosie="Bad cat, good cat"echo ${rosie:9}התחביר ${var:offset} מחלץ תת-מחרוזת החל מ-offset. כאן, הפלט הוא:
good catכדי לחלץ תת-מחרוזת באורך מסוים, השתמש ב-${var:offset:length}.
כדי לחלץ מסוף המחרוזת, השתמש ב-${var: -offset}. (שים לב לרווח לפני ה--!)
האם החידון שלי על Bash הותיר אותך הרוס?
ספר לי בתגובות למטה!
קריאה נוספת
רענן את כישורי ה-Bash שלך בעזרת המשאבים הבאים:
- מדריך Bash
- שאלות נפוצות על Bash
- ShellCheck
- אקדמיית Bash
- מדריך תכנות Bash
- מדריך עזר של Bash
- ויקי של האקרים Bash
- מדריך Bash למתחילים
- כרטיס עזר של Bash
