Онлайн робочі станції OnWorks Linux та Windows

логотип

Безкоштовний онлайн-хостинг для робочих станцій

<Попередній | зміст | Наступна>

Групові команди та підоболонки

бити дозволяє групувати команди разом. Це можна зробити одним із двох способів; або з a команду групи або з a підшелупка. Ось приклади синтаксису кожного:

Команда групи:

{ команда1; команда2; [команда3; ...] }

Підоболонка:

(команда1; команда2; [команда3;...])

Ці дві форми відрізняються тим, що групова команда оточує свої команди дужками, а підоболонка використовує дужки. Важливо відзначити, що завдяки способу бити реалізує групові команди, дужки повинні бути відокремлені від команд пробілом, а остання команда має закінчуватися крапкою з комою або новим рядком перед закриваючою дужкою.

Тож для чого корисні групові команди та підоболонки? Незважаючи на те, що вони мають важливу відмінність (до якої ми розглянемо трохи пізніше), вони обидва використовуються для керування перенаправленням. Давайте розглянемо сегмент сценарію, який виконує переспрямування кількох команд:



ls -l > вихідний файл.txt

echo "Перелік foo.txt" >> output.txt cat foo.txt >> output.txt

ls -l > вихідний файл.txt

echo "Перелік foo.txt" >> output.txt cat foo.txt >> output.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 "Перелік foo.txt"; cat foo.txt) > output.txt

(ls -l; echo "Перелік foo.txt"; cat foo.txt) > output.txt


Використовуючи цю техніку, ми заощадили себе на введенні тексту, але там, де групова команда або підоболонка дійсно сяє, це конвеєри. При побудові конвеєра команд часто буває корисно об’єднати результати кількох команд в один потік. Групові команди та підоболонки полегшують це:



{ ls -l; echo "Список foo.txt"; cat foo.txt; } | лпр

{ ls -l; echo "Список foo.txt"; cat foo.txt; } | лпр


Тут ми об’єднали вихідні дані трьох наших команд і передали їх на вхід LPR скласти друкований звіт.

У наступному сценарії ми будемо використовувати команди груп і розглянемо кілька прийомів програмування, які можна використовувати в поєднанні з асоціативними масивами. Цей сценарій, названий масив-2, коли дається ім’я каталогу, друкує список файлів у каталозі разом з іменами власника файлу та власника групи. В кінці списку сценарій друкує підсумок кількості файлів, що належать кожному власнику та групі. Тут ми бачимо результати (стиснуті для стислості), коли скрипту надається каталог

/usr/bin:


[me@linuxbox ~]$ масив-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 файл(и) root: 1380 файл(ів) тінь: 2 файл (s) ssh: 1 файл(и)

tty : 2 файл(ів)

utmp: 2 файл(и)


зображення

#! / бін / баш

#! / бін / баш

# масив-2: Використовуйте масиви для підрахунку власників файлів

declare -A файли file_group file_owner групує власників, якщо [[ ! -d "$1" ]]; тоді

echo "Використання: каталог array-2" >&2 вихід 1

fi


for i в "$1"/*; do owner=$(stat -c %U "$i") group=$(stat -c %G "$i") files["$i"]="$i" file_owner["$i"]=$ власник file_group["$i"]=$група ((++owners[$owner])) ((++groups[$group]))

зроблений


# Перелік зібраних файлів

{ for i в "${files[@]}"; do printf "%-40s %-10s %-10s\n" \

"$i" ${file_owner["$i"]} ${file_group["$i"]} виконано } | сортувати

# масив-2: Використовуйте масиви для підрахунку власників файлів

declare -A файли file_group file_owner групує власників, якщо [[ ! -d "$1" ]]; тоді

echo "Використання: каталог array-2" >&2 вихід 1

fi


for i в "$1"/*; do owner=$(stat -c %U "$i") group=$(stat -c %G "$i") files["$i"]="$i" file_owner["$i"]=$ власник file_group["$i"]=$група ((++owners[$owner])) ((++groups[$group]))

зроблений


# Перелік зібраних файлів

{ for i в "${files[@]}"; do 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" ${owners["$i"]} виконано } | сортувати

нудьгувати


# Список груп

echo "Власники групи файлів:"

{ for i в "${!groups[@]}"; робити

printf "%-10s: %5d файл(ів)\n" "$i" ${groups["$i"]} виконано } | сортувати

# Список власників

echo "Власники файлів:"

{ for i в "${!owners[@]}"; робити

printf "%-10s: %5d файл(ів)\n" "$i" ${owners["$i"]} виконано } | сортувати

нудьгувати


# Список груп

echo "Власники групи файлів:"

{ for i в "${!groups[@]}"; робити

printf "%-10s: %5d файл(ів)\n" "$i" ${groups["$i"]} виконано } | сортувати

Давайте подивимося на механіку цього скрипту:

Лінія 5: Асоціативні масиви повинні бути створені за допомогою декларувати команда за допомогою -A

варіант. У цьому скрипті ми створюємо п'ять масивів наступним чином:

файли містить назви файлів у каталозі, індексовані за ім'ям файлу file_group містить власника групи кожного файлу, індексовані за ім'ям файлу file_owner містить власника кожного файлу, індексовані за іменем файлів групи містять кількість файлів, що належать власникам індексованої групи містить кількість файлів, що належать індексованому власнику

Рядки 7-10: перевіряє, чи передано дійсне ім'я каталогу як позиційний параметр. Якщо ні, відображається повідомлення про використання, і сценарій завершує роботу зі статусом виходу 1.

Рядки 12-20: Перегляньте файли в каталозі. Використання stat Команда, рядки 13 і 14 витягують імена власника файлу та власника групи та призначають значення їхнім відповідним масивам (рядки 16, 17), використовуючи ім’я файлу як індекс масиву. Так само ім'я файлу присвоюється файлу файли масив (рядок 15).

Рядки 18-19: загальна кількість файлів, що належать власнику файлу та власнику групи, збільшується на одиницю.

Рядки 22-27: Виводиться список файлів. Це робиться за допомогою розширення параметра "${array[@]}", яке розширюється на весь список елементів масиву, при цьому кожен елемент розглядається як окреме слово. Це допускає можливість того, що ім’я файлу може містити вбудовані пробіли. Також зверніть увагу, що весь цикл укладено в дужки, таким чином формуючи групову команду. Це дозволяє перевести весь вихід циклу в трубку сортувати команда. Це необхідно, оскільки розширення елементів масиву не сортується.

Рядки 29-40: ці два цикли подібні до циклу списку файлів, за винятком того, що вони використовують «${!


array[@]}", яке розгортається до списку індексів масиву, а не до списку елементів масиву.


 

Найпопулярніші хмарні обчислення ОС на OnWorks: