Home Scripting לימוד סקריפטינג באש Bash למתחילים – Bash Basics Scripting

לימוד סקריפטינג באש Bash למתחילים – Bash Basics Scripting

by Tal Ben Shushan 27/08/2021 0 comment
לימוד סקריפטינג באש Bash למתחילים – Bash Basics Scripting
נהנתם מהמאמר ? שתפו אותו!

לימוד 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 שיציג לנו את המספר שורה בה הוא מצא את הטקסט שכן אם המסמך ממש גדול אז זה יעזור לנו לאתר איפה בדיוק

 

 

מאמרים קשורים

Leave a Comment