חידודים בעקבות כתיבה
שימוש נכון בגרשיים¶
tar czf "IG-$(date +'%d-%m-%Y').tar.gz" "/mnt/d/Program Files/IG"
- השתמשנו ב-" כדי לוודא שכל הארגומנט לקבי שם הקובץ, יהיה ארגומנט אחד.
- בפעם השניה השתמשנו בהם כי יש רווח ב-PATH NAME, ואנחנו צריכים שלא ייקטע
- השתמשנו ב-' כדי שהפקודה
date
תקבל את המשתנים שלה (%) כמשתנים שלה (כלומר תקבל את הטקסט %d ותבין אותו בעצמה כמשתנה); אם היינו כותבים בלי גרשיים, באש בעצמו היה מחפש ערך של משתנה d או m, במקום.
u### שימוש בלולאות
for dir in "/mnt/d/Program Files/Net Frameworks x86/"; do
tar czvf "$(basename "$dir")-$(date +'%d-%m-%Y').tar.gz" "$dir"
gpg -c "$(basename "$dir")-$(date +'%d-%m-%Y').tar.gz"
rm "$(basename "$dir")-$(date +'%d-%m-%Y').tar.gz"
done
- חשבתי שאין צורך ב-$dir אחרי הפקודה tar, אבל זה לא איך שלולאות 'for' עובדות: הלולאה יוצרת ערך של $dir לכל קובץ שתואם, ומבצעת את הרצפים שסיפקנו לו, פעם אחת לכל אחד. אנחנו עדיין צריכים לחבר בין $dir לפקודה בתוך הלולאה.
rm -f "/mnt/d/Program Files/Net Frameworks x86/ig-backups/"*.gpg &&
for dir in "/mnt/d/Program Files/Net Frameworks x86/"*; do
tar czvf "/mnt/d/Files/Backup/local/ig-backups/$(basename "$dir")-$(date +'%d-%m-%Y').tar.gz" "$dir" &&
echo "password" | gpg --batch --yes --passphrase-fd 0 -c "/mnt/d/Files/Backup/local/ig-backups/$(basename "$dir")-$(date +'%d-%m-%Y').tar.gz"
rm "/mnt/d/Files/Backup/local/ig-backups/$(basename "$dir")-$(date +'%d-%m-%Y').tar.gz"
done
- זה הסקריפט המגניב הראשון שלי! הוא לא עבד לרגע מכמה סיבות:
-
- כשכותבים בווינדוז מקבלים escape characters מהשטן - צריך להפעיל dos2unix...
- לא שמים && בסוף של לולאה! השורה האחרונה (rm) לא עבדה כי היא הסתיימה ב-&&
- אם רוצים את כל התיקיות שבתוך תיקיה אבל לא את התיקיה עצמה, עוטפים את ה-path אבל לא את הגלוב! אחרת הגלוב לא יתרחב...
"/mnt/d/Program Files/Net Frameworks x86/ig-backups/"*.gpg
ככה"/mnt/d/Program Files/Net Frameworks x86/ig-backups/*".gpg
ולא ככה
שימוש ב-newline¶
- לא לשכוח שאקו צריך e בשביל להתייחס ל-backslash escaped characters
- ההיגיון הוא שאנחנו מכניסים פקודה לאמצא של string באמצעות backslash escape
echo -e "\n" echo -e "- - - - - - - - - - - - - - - - - - - - - - - - - -\n" echo -e ""$1" is a $(stat --format=%F "$1")\nowned by: $(stat --format=%U "$1")\nin group: $(stat --format=%G "$1")\n" echo -e "permissions for "$1" are:\n$(stat --format=%A "$1")\n" echo -e "User: "$USER"\nGroup: "$?"" echo -e "Select permissions to edit (1\12\123 and so forth, in arbitrary sequence):\n 1) Owner\n 2) Group\n 3) Others\n"
בעקבות perms¶
- שימוש נכון בשלילות: ! (בהתחלה של לולאת "אם"), [...^], -v
- שימוש נכון ב-[] וב-[[]] בלולאות if (עם הרווח כי כל צד שלהן הוא פקודה)
- שימוש נכון ב-if וב-while - ובפרט ב-command 1, כלומר התנאי שלהן. (אם הפקודה הצליחה להדפיס משהו = exit status 0 = true)
- שימוש נכון בפונקציות, עם דגש על return (חוזר לאיפה שהייתה ה-call) - לא הבנתי בהתחלה שאם פונקציה עושה call לעצמה, אז מהרגע שזה קרה, return תחזיר את הפונקציה לעצמה!!! להיזהר מרקורסיביות...
- שימוש נכון בדגלים חשובים: q, i ו-v עבור grep, ו-e עבור echo
- עדכון נכון של משתנים (לא מתעדכנים אוטומטית גם אם הערך שלהם הוא משתנה ששינה ערך)
- שימוש בפקודות: bc, stat, id
- תירגלתי שימוש ב-sed וב-cut, סופר חשוב
- תירגלתי שימוש ב-regex: דיסיונקציות ([abc]), כמתים וטווחים ({1,3}[1-3] כדי להתאים 1/2/3 אחת עד שלוש פעמים וכו'), התחלת וסוף שורה (^xxx$ בשביל התאמה מדויקת וכו' - לשים לב שזה דולר בסוף, מתהפך פה).
- למדתי להשתמש טוב ב-read
- למדתי להשתמש ב-$1, 2 וכו' כדי לקחת ארגומנטים
- תירגלתי בניה של פייפים
- למדתי להדפיס כמו שצריך לטרמינל באמצעות backslash escaped new line character - כלומר
/n
- קצת debugging בסיסי - לקבל echos כשצריך וכו'
- היה סופר מלמד ויש מקום להרחיב אבל לאט לאט
בעקבות historyfinder¶
# Take input
input="$1"
# Define path for a history results temp file
temp_file="$HOME/.his-finder"
# Change IFS delimited to make 'select' ignore '|' as a delimiter
IFS=$'\n'
# Append to prompt command (runs between each command): "Write to .bash_history and reload .bash_history"
PROMPT_COMMAND="history -a; history -n; $PROMPT_COMMAND"
# Search for input query in .bash_history results, remove hf commands - take the 10 most recent results, sort them and filter dulpicates. Results are written to temp file.
func_search () {
cat "$HOME/.bash_history" | grep "$input" | grep -v ^hf | tail -n 10 | sort | uniq > "$temp_file"
return
}
# Create selection list from the temp file, append it to .bash_history, reload bash history.
func_list () {
select option in $(cat "$temp_file"); do
echo "$option" >> "$HOME/.bash_history"
break
done
history -r
return
}
# historyfinder needs to run inside the current shell session, using the 'source' command.
# check for alias, if it doesn't exist, create it and prompt user to reload bashrc.
if ! cat "$HOME/.bashrc" | grep -q "alias hf='source historyfinder'"; then
sudo echo "alias hf='source historyfinder'" >> "$HOME/.bashrc"
echo -e "\n an alias had been created for running historyfinder in the current shell session.\nPlease run '. ~/.bashrc' to reload your configuration.\n'hf (query)' to use historyfinder.\n"
return 2
fi
# if alias exists:
# create temp file
touch "$temp_file"
# Verify input
if [ "$input" = "$blank" ]; then
echo -e "\nPlease provide a query\n"
else
# run search function, followed by list function
func_search
func_list
fi
# delete temp file
rm "$temp_file"
- לסכם פקודת select
- לסכם $HOME בגרשיים
- לסכם הקאצ' עם sort ו-uniq
- יום אחד לכתוב עדכון: צריך לחשוב איך בודקים uniqness
- להבין כבר שמשתמשים בסוגריים מרובעות X1 עם IF כדי להשוות strings ובדאבל סוגריים כדי לעשות regex