לימוד Bash למתחילים
המדריך מבוצע על הפצת Kali
עברו לשולחן העבודה
cd Desktop
צרו סקריפט חדש
touch script.sh
כל סקריפט יהיה בסיומת sh
על מנת להריץ אותו ניתן הרשאות Execute
chmod +x script.sh
כעת נערוך את הקובץ ע"י mousepad
כעת נוכל לכתוב את הפקודה הראשונה שלנו והמפורסמת ביותר
תחילה נכתוב את תחילת הסקריפט !# שכן מסמן לנו באיזה shell להשתמש ובכן ברוב ההפצות של לינוקס המעטפת היא bash (קיים באתר הסבר על bash )
לכן בראש הסקריפט נכתוב
#! /bin/bash
echo "hello world"
ועל מנת להריץ את הסקריפט חשוב להיות בתיקייה בו הוא נמצא
ואז נוכל להקיש
./script.sh
תוכלו לברר באיזה תיקייה אתם ע"י הפקודה pwd ואם הקובץ בשולחן העבודה אתם צריכים להיות בDesktop
משתנה
כאשר אנחנו רוצים ששם מסוים כמו count יהיה ערך, זאת אומרת שנרשום count נקבל את הערך שכתבנו קודם אז אנחנו צריכים לייצר משתנה
אם המשתנה הוא מספרים , ניצור ללא "" כך
תחילה נבצע
count=10
ואז נדפיס אותו ע"י הפקודה echo ואז $count, בדיוק כמו בתמונה
ואם אתם רוצים לכתוב טקסט , אתם חייבים להכניס אותו ל ""
תנאים
if אומר שהתנאי חייב להתקיים , נבדוק לדוגמא את הסקרפיט הבא
זה המשתנה שלנו ששווה ל10
count=10
כעת הזנתי if והכנסתי את המשתנה שלנו ואז -eq שאומר שווה ל: וכתבתי 10
כעת רשמתי then ואז echo the number is equel זה אומר שאם המספר שווה ל10 אז הוא ידפיס "המספר הזה שווה"
ומה קורה כאשר לא? לא יופיע כלום, לכן הזנתי את else שכן אם המספר לא שווה ל10 או התנאי לא מתקיין אז תכתוב
the number is not euqeuql
שנו את הערך count למשל למספר 6 ובדקו מה קורה
בסיום חובה לכתוב fi שאומר לו שכאן נגמר התנאי
אופציות נוספות חוץ מ -eq שאומר שווה הם: -eq - שווה ל -gt - גדול מ -ne - לא שווה לא -lt - קטן מ
צורה נוספת היא ה< > שכן אומר קטן או גדול מ או ==
< קטן מ > גדול מ == שווה ל <= קטן ושווה ל >= גדול או שווה ל
אבל כדי שזה יעבוד תצטרכו להכניס סוגריים עגולים כפולים במקום [ ] כמו בתמונה:
elif
הוא תנאי באמצע שאומר אם if לא התקיים – אני חוזר על זה! לא התקיים! אז תבצע את התנאי הבא, למה זה elif כי זה תנאי שלם
לדוגמה נבדוק את הסקריפט הבא
הif אומר שאם count שהוא הערך והוא קטן מ10 אז תרשום שהמספר הזה קטן מ10
אבל אם המספר שווה ל10 אז תכתוב שהוא שווה
ואילו אם count גדול מ10 תרשום גדול יותר
אז ב elif הכנסתי == שאומר שווה, כך שהתנאי הראשון לא התקיים כיוון שcount שווה ל10 ולא קטן ממנו
כעת בשביל שאתם תוכלו לבדוק בעצמכם, כתבו את הסקריפט ושנו את count כערך פעם אחת גדול יותר ופעם אחת קטן יותר ובדקו
כעת נבדוק מה קורה כאשר אני מחבר תנאים בתוך תנאי אחד
כמו בתמונה
מה שהגדרתי כאן זה שאם number גדול מ20 אך קטן מ100 הוא יהיה בטווח ונקבל פלט שאומר זאת ואם נקיש 10 שאינו בטווח נקבל שהוא לא
כתבו את הסקריפט ובדקו
ניתן להשתמש גם ב|| במקום && ואף לחבר את הכל בלי ה]][[ באמצע
while
הוא למעשה דומה ל if רק שכאן הוא יבצע את הפעולה אם התנאי נכון בדיוק כמו ב if, אבל הוא יבצע שוב ושוב את הפעולה עד שהוא יסיים להריץ את הפעולה שביקשתם
לדוגמה פה
ניתן להבחין שיש משתנה שווה ל10 ואז while שאומר שאם המספק קטן מ100 תדפיס את המספר ואז תוסיף לו 1 כל פעם, עד שיגיע ל100
לעומת זאת ניתן להזין במקום while את until שאומר שאם התנאי לא נכון אז הוא ירוץ עד שיהיה נכון
נוכל גם לבצע זאת עם for שהוא כמו while לולאה
הגדרתי כאן שיספור מ0 עד 100 והמשתנה הוא בתוך n
Break
נניח שבלולאה for אנחנו רוצים שהוא יעצור ב10 ולא עד מאה אז נכניס break שעוצר אותו, בשביל זה נגדיר if שאם זה גדול מ10 תעצור
Continue
כשמו כן הוא, כאשר נרצה שימשיך ממספר כלשהו, נכניס continue במקום break כמו פה
Arithmetics
בBash כמו בכל שפה יש מתמטיקה פשוטה, זאת אומרת שיש את כל האופציות של ועוד, פחות,כפול,חילוק
על מנת לבצע את הפעולות האלו נשתמש ב expr שהוא למעשה מבצע את הפעולה המתמטית
על מנת להציג ועוד, פחות וחילוק אין צורך בהגדרה מיוחדת , ממש כמו בתמונה
אבל בשביל כפל ושארית
שארית מיוצג על ידי % ובגלל ש5 לא מתחלק ב20 השארית היא 5
מערכים ומיקומים – Arrys and Indexes
כעת נוכל להדפיס לתוך הסקריפט מערך , כל מערך מתחיל מ0 , זאת אומרת שהשם הראשון שנזין לו הוא 0 וכך נוכל להזין אחרי הסקריפט שם
אבל ברגע שנקליד את שם הסקריפט הוא יחשב למיקום 0 ולכן כאשר הרצתי כאן את השמות , התוצאה היא שם הסקריפט ואז Tal Noy
אם אני רוצה להזין את כל השמות אני מתחיל לספור מאחד שכן 0 הוא המיקום של הסקריפט עצמו, ככה
אופציה נוספת היא להגדיר את @$ שהוא משתנה של הכל, זאת אומרת ברגע שהגדרתי משתנה בשם name ואז הגדרתי בתוכו משתנה מסוג $@ אז אוכל להדפיס את זה ב echo ואף לציין את המיקום של השמות שאני רוצה
אם ארצה להדפיס את כל השמות ללא הגדרה של המיקומים אדפיס $@
אם ארצה לדעת כמה Indexes יש ברשימה אוכל להשתמש ב#
אוכל להציג רשימה ברצף למשל על ידי הפקודה הבא, בהכנסה למשתנה [@] ואז כאשר הדפיס אקבל את הרשימה כולה
אוכל גם כך לבדוק מה המיקומים של כל שם במערך ואף לבדוק כמה מערכים ישנם
שינוי של שם בתוך המערך או תוספת של שם אפשר ע"י כתיבה למשתנה שוב אך הפעם לציין את המיקום של המערך שאנחנו רוצים לשנות, כמו בתמונה
שבה הכנסתי את המילה blog למספר 3 וכך התווסף tal ben shushan blog
Stdin \ Stdout \ stderr
בלינוקס יש שלושה סוגים של std, אותם std הם למעשה ה output, התוצאה של פקודה ב bash
והם מוגדרים כמספרים – לדוגמה
stdin -0 זהו טקסט שאתם "מכניסים" לפקודה
stdout -1 שהוא המספר 1 הוא למעשה התוצאה של פקודה, תוצאה למשל היא הפלט של ls -l והיא תקינה ללא שגיאות
stderr 2 – כאשר הפקודה שהקשתם לא נכונה ומתקבלת שגיאה
על מנת להציג זאת בסקריפט ארשום בסקריפט את הפקודה הבאה עם ls -l שאומר תציג לי את הקבצים בתיקייה
ואז את הפלט מספר 1 שהוא stdout והפקודה התקינה תוציא לקובץ בשם lsfile.txt ואם יש שגיאות , תוציא ל errorls.txt
הפקודה ls -l, אין בה שגיאות ולכן יש פלט תקין והוא נכתב לlsfile.txt כמו שניתן להבחין כאן
לעומת זאת כאשר הקשתי ls -z שאינו קיים בפקודה ls השגיאה נכתבת ל errorls.txt והקובץ lsfile.txt ריק
כתיבה לתוך קובץ בעזרת export ושימוש בשני סקריפטים
כעת אצור סקריפט חדש בשם script2.sh ואיתו את הסקריפט script.sh
בscript.sh אכניס את הקוד המופיעה בתמונה, בקוד יש משתנה בשם Shushan והוא מיוצא למשתנה בעזרת הפקודה name
ואז אני מריץ את הסקריפט script2.sh
בתוך script2.sh אני מכניס echo שבו אני מדפיס Hello ואז : ואז שם המשתנה שמגיע מהסקריפט השני
אל תשכחו לתת הרשאות לscript2.sh שכן כל סקריפט שאתם מייצרים אתם צריכים לתת הרשאת Execute
כעת נריץ את script.sh ונבדוק שהוא לקח את המשתנה מהסקריפט השני
Input with Conditions
בסקריפט זה ניצור סקריפט שבו המשתמש מזין מספר והסקריפט שלנו יוודא אם המספר תואם או לא תואם למספר שהוא מזין
נכניס בשורות הראשונות את echo וזה מה שיוצג למשתמש ואז read שבו יהיה input שהמשתמש צריך להזין מספר
לאחר מכן ב if הראשון נזין תנאי if שבו אנו אומרים שאם מספר1 קטן ממספר 2 התשובה שתתקבל היא first number bigger then second number
לאחר מכן נכניס עוד if וזאת על ידי elif שבו נציין שכאשר מספר 2 קטן ממספר 1 יוצג הטקסט הבא second number is smaller hen second number
ולסיום אם המספר לא גדול ולא קטן אז נשאר רק שהמספר שווה למספר שהוזן וזאת נציין על ידי else
לסיום כמובן נזין fi
Concatenation – חיבור משתנים
על מנת לחבר שני משתנים שאותם למשל המשתמש הזין , נוכל בסיום ליצור משתנה בשם n1n2 ואז להכניס לשם את name1 u ואז את name2 ואז להדפיס את n1n2
ה" "בין name1 ל name2 הוא בשביל שיהיה רווח בין הטקסטים
Functions פונקציות
המטרה של פונקציה היא לבצע בלוק של קוד בפעולה אחת בלבד בכל פעם שנרצה את הפונקציה
לדוגמה הפונקציה הבאה, מציגה בפשטות hello, השם של הפונקציה היא tal
תארו לכם מצב בו תרצו להציג Hello במהלך הקוד שלכם כמה פעמים, נניח 50 פעם, ואם נחשוב על פונקציה יותר מסובכת אז בכל פעם שנרצה להריץ את שורות הקוד האלו נצטרך לכתוב אותם שוב ושוב ושוב , נניח והקוד שלכם מבצע פעולה מסוימת ומכיל 20 שורות
אבל במקום לכתוב את הקוד שוב ושוב בכל פעם במקום אחר בקוד שלכם תוכלו פשוט לכתוב פונקציה.
בתוך הפונקציה נניח את הקוד שלכם שמבצע פעולה מסוימת ובכל פעם שתרצו שהפונקציה תתבצע פשוט תכתבו את שם הפונקציה
בדוגמה פה רשמתי פשוט tal
או משתנה כמו פה
אפשר באותה המידה גם להזין ערכים לפונקציה כמו פה
תפריטים
תפריטים ב Bash הם האופציה של המשתמש לבחור לדוגמה מה הסקריפט יעשה לפי רשימה של אופציות
בדוגמה הקטנה הזו, הגדרתי שהמשתמש בוחר מתוך הרשימה
בשורה 2 הגדרתי מה יוצג למשתמש וזה לבחור שם
בשורה 3 רשמתי את התפריט שמתחיל בפונקציה select ואז במשתנה בשם name ואחריו in שאומר בתוך הרשימה, לרשימה הזנתי את השם המלא שלי , כל שכל חלק בשם הוא חלק מהרשימה
לאחר מכן do ואז הפעולה שאם המשתמש בוחר לעשות, בדוגמה פה הגדרתי שידפיס את השם שהמשתמש בוחר
הורדת קובץ והכנסתו כסקריפט
כאן משתמש ב curl שהוא כלי גישה לפרוטוקול ה http ובקוד הקטן כאן הכנסתי את הקישור להורדה של putty ולמשתנה קראתי url כעת לאחר מכן רשמתי curl ${url} וה-o זה בשביל השם של הקובץ שיירד- השם יהיה השם המקורי של הקובץ
נסו אתם
יצירת תוכנית קטנה – בדיקה אם תיקייה קיימת או לא
קודם בשורה 3 נשתמש ב mkdir וניצור תיקייה בשם talfolder ה-p זה על מנת שאם התיקייה קיימת, לא נקבל שגיאה אלא התיקייה תיווצר שוב
בשורה 4-5 נגדיר מה לרשום למשתמש להזין וזה את שם התיקייה שנבדוק אם היא קיימת
כעת נכניס תנאי if ובתוכו -d בשביל תיקייה (directory) ואז משתנה בשם $folder
כעת אחרי ה then נגיד שאם התנאי נכון אז המשתמש יקבל שהתיקייה קיימת וelse שהתיקייה לא קיימת
הריצו את הסקריפט ובדקו שהוא תקין
אותו הדבר נוכל לבצע בבדיקה על קובץ והפעם נניח שהתוכנית תבצע כך:
אם הקובץ קיים, נשאל את המשתמש איזה טקסט הוא רוצה להכניס לתוך הקובץ ואם הקובץ טקסט לא קיים המשתמש יקבל שגיאה
אז בשורה 3 נרשום הכנס את שם הקובץ
בשורה 6 נכניס את -f שבודק קובץ ואת המשתנה $file
כעת בתוך ה if אם התנאי נכון והקובץ קיים נשאל את המשתמש איזה טקסט להכניס לבפנים ובשורה 10 נוכל לראות שהשתמשת ב<< שאומר append (לעומת < פעם אחת שידרוס כל פעם את הטקסט הקיים) וזה אומר שהמשתנה $text יכנס למשתנה $file שאותו הזין המשתמש קודם לכן כשם הקובץ טקסט
ואם הקובץ לא קיים אז המשתמש יקבל שגיאה שאינו קיים
כעת בדקו את התוכנית
המשך יצירת תוכנית – מחיקת קובץ
בדוגמה הזו ניצור תוכנית קטנה שתמחק קובץ אם קיים ואם לא נקבל שגיאה
הדבר היחיד ששונה הוא rm שכן rm הוא הכלי למחיקת קבצים ותיקיות
יצירת תוכנית – חיפוש בתוך קובץ
בתוכנית הקטנה הזו נגדיר שהמשתמש רושם את שם הקובץ שהוא רוצה לחפש בו ואז הסקריפט שלנו יחפש ע"י grep את הטקסט בתוך הקובץ ויציג את התוצאה
בשורה ה3 רשמתי למשתמש מה לרשום וזה את שם הקובץ ואת המשתנה שאליו יכנס הטקסט שיכניס המשתמש שהוא file
כעת בשורה 6 בתנאי אגדיר שאם הקובץ -f שהוא המשתנה $file והוא קיים אז אחריו יגיע הטקסט שישאל את המשתמש (שורה 8) מה הטקסט שאתה רוצה לחפש , בתוכו הגדיר את המשתנה greping ואז אכניס לgrep -i שהi אומר בgrep שהוא לא יתייחס אם הטקסט שהוא מחפש עם אותיות קטנות או לא.
לאחר מכן רשמתי את שני המשתנים כיוון שgrep יכול לחפש בתצורה הזו בקובץ
grep -i TheTextToSearch TheFile.txt
אז הכנסתי את המשתנים של הקובץ ושל הטקסט שאותו הזין המשתמש
לסיום ב else שאם התנאי הראשון לא מתקיים אז המשתמש יקבל שגיאה.
נוכל גם להוסיף את האופציה -n ב grep שיציג לנו את המספר שורה בה הוא מצא את הטקסט שכן אם המסמך ממש גדול אז זה יעזור לנו לאתר איפה בדיוק