מדריך למתחילים כדי Shell Scripting 2 עבור לולאות
אם אתה רוצה לבנות את חנון האשראי שלך, להצטרף אלינו עבור הפרק השני בסדרה scripting פגז שלנו. יש לנו כמה תיקונים, כמה שיפורים בתסריט של השבוע שעבר, וכן מדריך על looping עבור uninitiated.
הסקריפט datecp Revisited
בתיק הראשון של המדריך scripting פגז שלנו, עשינו סקריפט שהעתיק קובץ לספריית גיבוי לאחר הוספת תאריך עד סוף שם הקובץ.
סמואל Dionne-Riel ציין את ההערות כי יש דרך טובה יותר להתמודד עם הפניות משתנה שלנו.
ארגומנטים מופרדים בחלל בקליפת הבאש, היא תיצור אסימון כאשר יש רווח בפקודה המורחבת שנוצרה. בתסריט שלך,
cp $ 1 $ 2. $ date_formatted
יפעל כמתוכנן כל עוד אין למשתנים המורחבים רווחים. אם אתה קורא את התסריט שלך בדרך זו:datecp "השם הישן שלי" "השם החדש שלי"
ההרחבה תגרום לפקודה זו:cp השם החדש שלי השם הישן שלי
אשר למעשה יש 6 טיעונים.כדי לטפל בבעיה זו כראוי, השורה האחרונה של הסקריפט צריכה להיות:
cp "$ 1" "$ 2. $ date_formatted"
כפי שניתן לראות, שינוי קו הסקריפט שלנו מ:
cp -iv $ 1 $ 2. $ date_formatted
ל:
cp -iv "$ 1" "$ 2". $ date_formatted
יטפל בבעיה זו בעת שימוש בסקריפט על קבצים שיש להם רווחים בשם. כמו כן, סמואל טוען כי בעת העתקה והדבקה של קוד מאתר זה (או האינטרנט בכלל) הקפד להחליף את המקפים והציטוטים המתאימים עבור ה"טיפוגרפיות טוב יותר "שבמקרים רבים מחליפים אותם. אנחנו גם נעשה יותר כדי לוודא את הקוד שלנו הוא יותר להעתיק / להדביק ידידותי. ,-)
פרשן נוסף, Myles Braithwaite, החליט להרחיב את התסריט שלנו כך שהתאריך יופיע לפני סיומת הקובץ. אז במקום
ttfile.mp3.07_14_11-12.34.56
היינו מקבלים את זה:
ttfile.07_14_11-12.34.56.mp3
אשר בסופו של דבר להיות קצת יותר נוח עבור רוב המשתמשים. הקוד שלו זמין בדף GitHub שלו. בואו נסתכל על מה הוא משתמש כדי לפרק את שם הקובץ.
date_formatted = $ $ (תאריך +% Y-% m-% d_% H.% M% S)
file_extension = $ (הד "$ 1" | awk -F. הדפס $ NF ')
file_name = $ (שם קובץ בסיס $ 1. $ file_extension)cp -iv $ 1 $ file_name- $ date_formatted. $ file_extension
שיניתי את העיצוב קצת, אבל אתה יכול לראות כי Myles מכריז על תאריך הפונקציה שלו בשורה 1. בשורה 2, לעומת זאת, הוא משתמש "הד" הפקודה עם הטיעון הראשון של התסריט כדי פלט את שם הקובץ. הוא משתמש בצינור הפקודה לקחת את הפלט ולהשתמש בו כקלט עבור החלק הבא. לאחר הצינור, Myles שיחות על הפקודה "awk", שהיא תוכנית סריקה חזקה דפוס. באמצעות דגל -F, הוא אומר את הפקודה כי הדמות הבאה (אחרי רווח) הוא מה יגדיר את "מפריד השדה". במקרה זה, זו תקופה.
עכשיו, awk לראות קובץ בשם "tastyfile.mp3" כמו להיות מורכב משני שדות: "tastyfile" ו "MP3". לבסוף, הוא משתמש
'הדפס $ NF'
כדי להציג את השדה האחרון. במקרה הקובץ שלך יש תקופות מרובות - ומכאן עושה awk לראות שדות מרובים - זה רק להציג את האחרון, המהווה את סיומת הקובץ.
בשורה 3, הוא יוצר משתנה חדש עבור שם הקובץ ומשתמש בפקודה "basename" כדי להפנות כל דבר ב $ 1 מלבד את סיומת הקובץ. זה נעשה באמצעות basename ונותן אותו 1 $ כמו הטיעון שלה, ולאחר מכן הוספת רווח סיומת הקובץ. סיומת הקובץ מתווספת אוטומטית בגלל המשתנה שמתייחס לקו 2. מה זה יעשה
טעים
ולהפוך אותו
טעים
ואז בשורה האחרונה, Myles להרכיב את הפקודה כי יהיה פלט הכל בסדר. שים לב שאין התייחסות ל $ 2, ארגומנט שני עבור הסקריפט. זה סקריפט מסוים יהיה להעתיק את הקובץ אמר לתוך הספרייה הנוכחית שלך במקום. עבודה נהדרת סמואל ומילים!
הפעלת סקריפטים ו $ PATH
אנו מזכירים גם במאמר הבסיסי שלנו כי סקריפטים אינם מורשים להיות מופנים כפקודות כברירת מחדל. כלומר, אתה צריך להצביע על נתיב התסריט כדי להפעיל אותו:
./ script
~ / bin / script
אבל, על ידי הצבת סקריפטים שלך ~ / bin /, אתה יכול פשוט להקליד את שמותיהם מכל מקום כדי לגרום להם לרוץ.
פרשנים השקיעו זמן מה כדי לדון עד כמה זה נכון, שכן לא המודרנית לינוקס distro יוצר את המדריך כברירת מחדל. יתר על כן, אף אחד לא מוסיף את זה המשתנה $ PATH כברירת מחדל או, וזה מה שנדרש על מנת סקריפטים להיות לרוץ כמו פקודות. הייתי קצת מבולבל כי לאחר בדיקת המשתנה $ PATH, המגיבים היו צודקים, אבל הקריאה סקריפטים עדיין עבד בשבילי. גיליתי מדוע: רבים מהפצות לינוקס מודרניות יוצרים קובץ מיוחד בספריית הבית של המשתמש - .profile.
קובץ זה נקרא על ידי bash (אלא אם כן .bash_profile נמצא בספריית הבית של המשתמש) ובתחתית, יש סעיף שמוסיף את ~ / bin / תיקייה למשתנה $ PATH אם הוא קיים. אז, כי המסתורין הוא פינה. עבור שאר הסדרה, אני ימשיך להציב סקריפטים בספרייה ~ / bin / כי הם סקריפטים למשתמש צריך להיות מסוגל להיות מופעל על ידי משתמשים. ו, נראה שאנחנו לא באמת צריך להתעסק עם המשתנה $ PATH ביד כדי לקבל דברים עובד.
פקודות חוזרות עם לולאות
בואו להגיע לאחד הכלים השימושיים ביותר ארסנל חנון להתמודדות עם משימות חוזרות: לולאות. היום, אנחנו נדון "ל" לולאות.
המתאר הבסיסי של לולאה הוא כדלקמן:
עבור VARIABLE LIST; לעשות
הפקודה
הפקודה
...
הפקודה
בוצע
משתנה יכול להיות כל משתנה, אם כי לרוב "קטן" אני משמש את האמנה. רשימה היא רשימה של פריטים; באפשרותך לציין פריטים מרובים (הפרדתם בחלל), להצביע על קובץ טקסט חיצוני או להשתמש בכוכבית (*) כדי לציין כל קובץ בספריה הנוכחית. הפקודות הרשומות מוזזמות על ידי האמנה, כך שקל יותר לראות לולאות לשים קופסאות לולאות (כך שאתה יכול לולאה בזמן שאתה לולאה).
בגלל רשימות להשתמש רווחים כמו מפרידים - כלומר, רווח מציין מעבר לפריט הבא ברשימה - קבצים שיש להם רווחים שם הם לא מאוד ידידותי. לעת עתה, בואו מקל לעבוד עם קבצים ללא רווחים.התחל עם סקריפט פשוט להציג את שמות הקבצים בספרייה הנוכחית. צור סקריפט חדש בתיקיה ~ / bin / תיקייה בשם "loopscript". אם אתה לא זוכר איך לעשות את זה (כולל סימון זה כמו הפעלה והוספת חשיש המפץ גרזן) עיין בסעיפים הבסיסיים שלנו Scripting בס.
בתוכה, הזן את הקוד הבא:
עבור ב פריט 1 item2 item3 item4 item5 item6; לעשות
הד "$ i"
בוצע
כאשר אתה מפעיל את התסריט, אתה צריך רק לקבל אותם פריטים ברשימה כמו פלט.
די פשוט, נכון? בואו נראה מה יקרה אם נשנה את העניינים קצת. שנה את הסקריפט שלך כך שהוא אומר זאת:
אני ב *; לעשות
הד "$ i"
בוצע
כאשר אתה מפעיל את הסקריפט בתיקיה, אתה צריך לקבל רשימה של קבצים שהיא מכילה פלט.
עכשיו, בואו לשנות את הפקודה הד למשהו שימושי יותר - נגיד, את הפקודה zip. כלומר, נוסיף קבצים לארכיון. ו, בואו לקבל כמה טיעונים בתערובת!
עבור i $ @; לעשות
zip ארכיון "$ i"
בוצע
יש משהו חדש! "$ @" הוא קיצור של "$ 1 $ 2 $ 3 ... $ n". במילים אחרות, זוהי הרשימה המלאה של כל הארגומנטים שציינת. עכשיו, לראות מה קורה כאשר אני מפעיל את התסריט עם כמה קבצי קלט.
באפשרותך לראות אילו קבצים נמצאים בתיקיה שלי. רצתי את הפקודה עם שישה טיעונים, וכל קובץ נוסף לארכיון מכווץ בשם "archive.zip". קל, נכון?
עבור לולאות הם די נפלא. עכשיו אתה יכול לבצע פונקציות אצווה על רשימות של קבצים. לדוגמה, באפשרותך להעתיק את כל הארגומנטים של הסקריפט לארכיון מכווץ, להעביר את מסמכי המקור לתיקייה אחרת, ולאבטח באופן אוטומטי את קובץ ה- zip למחשב מרוחק. אם אתה מגדיר קבצי מפתח עם SSH, אתה אפילו לא צריך להזין את הסיסמה שלך, ואתה יכול אפילו לספר את הסקריפט כדי למחוק את קובץ ה- zip לאחר העלאת אותו!
באמצעות לולאות עושה את זה קל לעשות חבורה של פעולות עבור כל הקבצים בספרייה. אתה יכול מחסנית מגוון רחב של פקודות יחד ולהשתמש ארגומנטים בקלות ליצור על רשימת לעוף, וזה רק קצה הקרחון.
סקריפטים, יש לך הצעות? האם עשית סקריפט שימושי המשתמש בלולאות? רוצה לשתף אתכם במחשבות על הסדרה? השאירו כמה הערות ולעזור אחרים scripting Newbies החוצה!