לדלג לתוכן

חידודים בעקבות כתיבה

שימוש נכון בגרשיים

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