עזרה בכתיבת סקריפט bash

xl700v1

New member
עזרה בכתיבת סקריפט bash


שלום רב,
אני חדש בעולם הלינוקס.ואני ממש חייב לכתוב bash סקריפט לאיזה פרוייקט בעבודה.אציין שאין לי רקע בפיתוח,וגם לאחר חיפושים ברשת לא הצלחתי לכתוב את מה שאני צריך.
מה שאני צריך לכתוב זה ככה.לכתוב סקריפט שמוחק קבצים מתיקייה מסויימת ומתנהג כך.כשהמשתמש יריץ את הסקריפט תיהיה שאלה האם הוא בטוח שהוא רוצה למחוק קבצים עם אופציית בחירה של y/n .במידה וילחץ y הסקריפט יגיד לו להכניס את הPATH של התיקייה וימחק את הקבצים אחרי לחיצה על כפתור enter,אח"כ ישאל האם ברצונו למחוק עוד קבצים מתיקיות אחרות במידה וילחץ Y אז הפעולה תתפקד כמו שכתבתי בהתחלה. במידה וילחץ על n אז הסקריפט פשוט יכתוב תודה.

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

Dניאל Mור

New member
המלצה

אהלן, מה קורה?

לגבי החיפוש ברשת: מה בדיוק חיפשת? אסביר לך מדוע ומה אני רוצה\מנסה לומר. קח את המטלה שקיבלת, תחלק אותה לתתי משימות (לדוגמא: הצגת פלט למסך, קליטת קלט מהמקלדת, פקודת המחיקה עצמה ועוד) ואת החלקים האלו תחפש ברשת. משוכנע אני שתמצא ושהכיף בלימוד יהיה גדול!

בהצלחה רבה!

+דניאל.
 

xl700v1

New member
תודה

תודה על התשובה המהירה.
היית ממליץ על שיעורים פרטיים בנושא?
 

Testosterone

New member
אין כמו סקריפטים
הנה, בבקשה:

(במקומך, הייתי עובר על הסקריפט הזה שורה אחר שורה ומנסה להבין אותו. לא עשיתי אותו מסובך, האמת שעיקמתי אותו כדי שלא יהיה מסובך להבנה וכתבתי לך הערות שמתחילות ב"#")



#!/bin/bash

BREAK=0 # Set value of '0' to variable 'BREAK'
echo -e "\n---Delete Files Wizard---\n"
echo -e "Would like to start deleting files? [Y/N]"
read answer # 'read' the user's answer and save it in 'answer' variable
[ $answer = "N" ] && echo -e "Ciao buddy!" && exit 0 || # If the answer is no, exit with 'Ciao', if not, conti
nue
while BREAK=0 ; do #While the value of BREAK equals '0' run the following questions:
echo -e "\nPlease input the path from which files will be deleted and press ENTER"
read path # Read the 'path' the user inputs and save it in 'path' variable
rm -rf ${path}/* && echo -e "\nAll files under $path have been deleted" || echo -e "\nCannot delete files under $path . Perhaps it's a permissions' issue.."
echo -e "\nDelete more? [Y\N]"
read answer2
[ $answer2 = "N" ] && ((BREAK++)) ; echo -e "\nHave a good day!\n" ; exit 0 # If the user doesn't want to continue
, 'BREAK' now eqauls 1, hence the 'while' loop will discontinue.
done
 

Testosterone

New member
והנה שיעורי בית בשבילך:

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

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

(וכוסאמא של תפוז שלא נותנים לערוך הודעות)
 

xl700v1

New member
שאלה

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

Testosterone

New member
באיזו הפצה אתה משתמש?

אצלי הוא עובד בדיוק כמתוכנן.

מה הפלט של הפקודות הבאות:

cat /etc/redhat-release
bash --version
 

xl700v1

New member
פרטי סביבה

GNU bash, version 3.00.16(1)-release (sparc-sun-solaris2.10)
Copyright (C) 2004 Free Software Foundation, Inc.
 

Testosterone

New member
הבנתי. תנסה את זה במקום השורות האחרונות:

read answer2
if [ $answer2 = "N" ] ; then
BREAK=0
echo -e "\nHave a good day!\n"
exit 0
else
continue
fi
done
 

Testosterone

New member
אופפס, BREAK=1

למרות שזה יעבוד גם ככה כי נתתי לו exit 0 בתנאי.

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

bash -x SCRIPT_NAME

ותדביק לכאן את כל הפלט.
 

xl700v1

New member
כן

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

Testosterone

New member
נכון מאוד.

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

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

Testosterone

New member
עדיין?! מתי באש נהייתה ארכאית?

Bash אמנם לא ורסטילית/עשירה כמו פייתון, והיא די מוגבלת, אך בשביל המטרה שלו - אין סיבה להשתמש בשפה אחרת.
וחוץ מזה, Bash תמיד משתדרגת ומקבלת יכולות של שפות חזקות ממנה עם השנים (לדוג', Associative Arrays שהוצגו בגרסה 4+).
וחוץ מזה (2), הוא יכול ללמוד Bash משימוש יום יומי עם לינוקס, מה שהוא לא יכול לעשות עם פייתון.

כתבתי כלים עם אלפי שורות בBash, והם עובדים מצוין. אני אמנם יודע ואוהב פייתון, אבל בשבילי Bash תמיד עבדה מעולה ל(רוב) הדברים שהייתי צריך בלינוקס.
 
למעלה