OnWorks Linux ו-Windows Online WorkStations

לוגו

אירוח מקוון בחינם עבור תחנות עבודה

<הקודם | תוכן | הבא>

קבוצת פקודות ותת-קונכיות

לחבוט מאפשר לקבץ פקודות יחד. ניתן לעשות זאת באחת משתי דרכים; או- או עם א פקודה קבוצתית או עם א תת קליפה. להלן דוגמאות לתחביר של כל אחד מהם:

פקודת הקבוצה:

{ פקודה1; פקודה2; [פקודה3; ...] }

תת מעטפת:

(פקודה1; פקודה2; [פקודה3;...])

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

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



ls -l > output.txt

echo "רישום של foo.txt" >> output.txt cat foo.txt >> output.txt

ls -l > output.txt

echo "רישום של foo.txt" >> output.txt cat foo.txt >> output.txt


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


{ ls -l; echo "רישום של foo.txt"; cat foo.txt; } > output.txt

{ ls -l; echo "רישום של foo.txt"; cat foo.txt; } > output.txt


השימוש במעטפת משנה דומה:



(ls -l; echo "Listing of foo.txt"; cat foo.txt) > output.txt

(ls -l; echo "Listing of foo.txt"; cat foo.txt) > output.txt


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



{ ls -l; echo "רישום של foo.txt"; cat foo.txt; } | lpr

{ ls -l; echo "רישום של foo.txt"; cat foo.txt; } | lpr


כאן שילבנו את הפלט של שלוש הפקודות שלנו והכנסנו אותן לקלט של lpr להפיק דו"ח מודפס.

בסקריפט שלאחר מכן, נשתמש בפקודות קבוצות ונבחן מספר טכניקות תכנות שניתן להשתמש בהן בשילוב עם מערכים אסוציאטיביים. התסריט הזה, שנקרא מערך-2, כאשר ניתן שם של ספרייה, מדפיס רשימה של הקבצים בספריה יחד עם שמות הבעלים של הקובץ ובעל הקבוצה. בסוף הרישום, התסריט מדפיס סיכום של מספר הקבצים השייכים לכל בעלים וקבוצה. כאן אנו רואים את התוצאות (תמצית לקיצור) כאשר התסריט מקבל את הספרייה

/usr/bin:


[me@linuxbox ~]$ array-2 /usr/bin

/usr/bin/2to3-2.6

שורש

שורש

/usr/bin/2to3

שורש

שורש

/usr/bin/a2p

שורש

שורש

/usr/bin/abrowser

שורש

שורש

/usr/bin/aconnect

שורש

שורש

/usr/bin/acpi_fakekey

שורש

שורש

/usr/bin/acpi_listen

שורש

שורש

/usr/bin/add-apt-repository

שורש

שורש

.

.

.

/usr/bin/zipgrep

שורש

שורש

/usr/bin/zipinfo

שורש

שורש

/usr/bin/zipnote

שורש

שורש

/usr/bin/zip

שורש

שורש


/usr/bin/zipsplit

/usr/bin/zjsdecode

/usr/bin/zsoelim

שורש שורש שורש

שורש שורש שורש

בעלי קבצים: דמון: 1


קבצים)

שורש: 1394

קבצים)

תמונה

בעלי קבוצת קבצים: crontab : 1 קבצים דמון : 1 קבצים lpadmin : 1 קבצים דואר : 4 קבצים mlocate : 1 קבצים שורש : 1380 קבצים צל : 2 קבצים (s) ssh : 1 קבצים

tty: 2 קבצים

utmp: 2 קבצים


תמונה

#! / bin / bash

#! / bin / bash

# array-2: השתמש במערכים כדי לחשב את בעלי הקבצים

להצהיר על -A files file_group file_owner קבוצות בעלים אם [[ ! -d "$1" ]]; לאחר מכן

echo "שימוש: array-2 dir" >&2 יציאה 1

fi


עבור i ב-"$1"/*; do owner=$(stat -c %U "$i") group=$(stat -c %G "$i") files["$i"]="$i" file_owner["$i"]=$ owner file_group["$i"]=$group ((++בעלים[$owner])) ((++groups[$group]))

עשה


# רשום את הקבצים שנאספו

{ for i ב-"${files[@]}"; עשה printf "%-40s %-10s %-10s\n" \

"$i" ${file_owner["$i"]} ${file_group["$i"]} בוצע } | סוג

# array-2: השתמש במערכים כדי לחשב את בעלי הקבצים

להצהיר על -A files file_group file_owner קבוצות בעלים אם [[ ! -d "$1" ]]; לאחר מכן

echo "שימוש: array-2 dir" >&2 יציאה 1

fi


עבור i ב-"$1"/*; do owner=$(stat -c %U "$i") group=$(stat -c %G "$i") files["$i"]="$i" file_owner["$i"]=$ owner file_group["$i"]=$group ((++בעלים[$owner])) ((++groups[$group]))

עשה


# רשום את הקבצים שנאספו

{ for i ב-"${files[@]}"; עשה printf "%-40s %-10s %-10s\n" \

"$i" ${file_owner["$i"]} ${file_group["$i"]} בוצע } | סוג

הנה רשימה (עם מספרי שורות) של התסריט:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26


27

28

29

30

31

32

33

34

35

36

37

38

39

40

27

28

29

30

31

32

33

34

35

36

37

38

39

40


תמונה

הד

הד

# בעלי רשימה

echo "בעלי קבצים:"

{ for i ב-"${!owners[@]}"; לַעֲשׂוֹת

printf "%-10s: %5d קבצים\n" "$i" ${בעלים["$i"]} בוצעו } | סוג

הד


# רשימת קבוצות

echo "בעלי קבוצת קבצים:"

{ for i ב-"${!groups[@]}"; לַעֲשׂוֹת

printf "%-10s: %5d קבצים\n" "$i" ${קבוצות["$i"]} בוצעו } | סוג

# בעלי רשימה

echo "בעלי קבצים:"

{ for i ב-"${!owners[@]}"; לַעֲשׂוֹת

printf "%-10s: %5d קבצים\n" "$i" ${בעלים["$i"]} בוצעו } | סוג

הד


# רשימת קבוצות

echo "בעלי קבוצת קבצים:"

{ for i ב-"${!groups[@]}"; לַעֲשׂוֹת

printf "%-10s: %5d קבצים\n" "$i" ${קבוצות["$i"]} בוצעו } | סוג

בואו נסתכל על המכניקה של התסריט הזה:

5 קו: יש ליצור מערכים אסוציאטיביים עם ה לְהַכרִיז באמצעות הפקודה -A

אוֹפְּצִיָה. בסקריפט זה אנו יוצרים חמישה מערכים באופן הבא:

קבצים מכילים את שמות הקבצים בספריה, באינדקס לפי שם הקובץ file_group מכיל את הבעלים של הקבוצה של כל קובץ, באינדקס לפי שם הקובץ file_owner מכיל את הבעלים של כל קובץ, באינדקס לפי שם הקבצים קבוצות מכילות את מספר הקבצים השייכים לבעלי הקבוצה המאונדקסת מכיל את מספר הקבצים השייכים לבעלים שנוספו לאינדקס

שורות 7-10: בודק ששם ספרייה חוקי הועבר כפרמטר מיקום. אם לא, תוצג הודעת שימוש והסקריפט יוצא עם סטטוס יציאה של 1.

שורות 12-20: עברו בלולאה בין הקבצים בספריה. משתמש ב stat הפקודה, שורות 13 ו-14 מחלצות את שמות בעלי הקובץ ובעל הקבוצה ומקצות את הערכים למערכים המתאימים שלהם (שורות 16, 17) תוך שימוש בשם הקובץ בתור אינדקס המערך. כמו כן, שם הקובץ עצמו מוקצה ל- קבצים מערך (שורה 15).

שורות 18-19: המספר הכולל של קבצים השייכים לבעל הקובץ ולבעל הקבוצה גדל באחד.

שורות 22-27: רשימת הקבצים מופצת. זה נעשה באמצעות הרחבת הפרמטר "${array[@]}" שמתרחבת לכל רשימת רכיבי המערך כאשר כל אלמנט מתייחס כמילה נפרדת. זה מאפשר את האפשרות ששם קובץ עשוי להכיל רווחים מוטבעים. שימו לב גם שהלולאה כולה סגורה בסוגרים ובכך יוצרים פקודה קבוצתית. זה מאפשר להזרים את כל הפלט של הלולאה לתוך sort פקודה. זה הכרחי מכיוון שהרחבת רכיבי המערך אינה ממוינת.

שורות 29-40: שתי לולאות אלו דומות ללולאת רשימת הקבצים פרט לכך שהן משתמשות ב-"${!


הרחבת array[@]}" שמתרחבת לרשימת אינדקסי המערך ולא לרשימת רכיבי המערך.


 

מחשוב ענן מערכת ההפעלה המוביל ב-OnWorks: