Онлайн-рабочие станции OnWorks Linux и Windows

Логотип

Бесплатный хостинг в Интернете для рабочих станций

<Предыдущая | Содержание: | Следующая>

Групповые команды и субоболочки

колотить позволяет группировать команды вместе. Это можно сделать одним из двух способов; либо с групповая команда или с подоболочка. Вот примеры синтаксиса каждого из них:

Групповая команда:

{command1; command2; [command3; ...]}

Дополнительная оболочка:

(команда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


Это довольно просто. Три команды, вывод которых перенаправлен в файл с именем вывод.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; } | LPR

{ls -l; echo "Распечатка файла foo.txt"; cat foo.txt; } | LPR


Здесь мы объединили выходные данные наших трех команд и передали их по конвейеру на вход LPR для выпуска печатного отчета.

В следующем сценарии мы будем использовать групповые команды и рассмотрим несколько методов программирования, которые можно использовать в сочетании с ассоциативными массивами. Этот сценарий называется массив-2при присвоении имени каталога печатает список файлов в каталоге вместе с именами владельца файла и владельца группы. В конце списка сценарий печатает количество файлов, принадлежащих каждому владельцу и группе. Здесь мы видим результаты (сокращенные для краткости), когда скрипту предоставляется каталог

/ usr / bin:


[я @ linuxbox ~] $ массив-2 / usr / bin

/USR/бин/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-репозиторий

корень

корень

.

.

.

/ 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 / Баш

#! / Bin / Баш

# array-2: использовать массивы для подсчета владельцев файлов

объявить -A файлы file_group file_owner групп владельцев, если [[! -d "$ 1"]]; тогда

echo "Usage: array-2 dir"> & 2 exit 1

fi


для i в "$ 1" / *; do owner = $ (stat -c% U "$ i") group = $ (stat -c% G "$ i") files ["$ i"] = "$ i" file_owner ["$ i"] = $ владелец file_group ["$ i"] = $ group ((++ владельцев [$ owner])) ((++ groups [$ group]))

сделанный


# Список собранных файлов

{вместо i в "$ {files [@]}"; do printf "% -40s% -10s% -10s \ n" \

"$ i" $ {file_owner ["$ i"]} $ {file_group ["$ i"]} готово} | Сортировать

# array-2: использовать массивы для подсчета владельцев файлов

объявить -A файлы file_group file_owner групп владельцев, если [[! -d "$ 1"]]; тогда

echo "Usage: array-2 dir"> & 2 exit 1

fi


для i в "$ 1" / *; do owner = $ (stat -c% U "$ i") group = $ (stat -c% G "$ i") files ["$ i"] = "$ i" file_owner ["$ i"] = $ владелец file_group ["$ i"] = $ group ((++ владельцев [$ owner])) ((++ groups [$ group]))

сделанный


# Список собранных файлов

{вместо 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 "Владельцы файлов:"

{для i в "$ {! владельцев [@]}"; делать

printf "% -10s:% 5d файл (ы) \ n" "$ i" $ {owner ["$ i"]} готово} | Сортировать

эхо


# Список групп

echo "Владельцы группы файлов:"

{для i в "$ {! groups [@]}"; делать

printf "% -10s:% 5d файл (ы) \ n" "$ i" $ {groups ["$ i"]} готово} | Сортировать

# Список владельцев

echo "Владельцы файлов:"

{для i в "$ {! владельцев [@]}"; делать

printf "% -10s:% 5d файл (ы) \ n" "$ i" $ {owner ["$ i"]} готово} | Сортировать

эхо


# Список групп

echo "Владельцы группы файлов:"

{для i в "$ {! groups [@]}"; делать

printf "% -10s:% 5d файл (ы) \ n" "$ i" $ {groups ["$ i"]} готово} | Сортировать

Давайте посмотрим на механику этого скрипта:

Линия 5: Ассоциативные массивы должны быть созданы с объявлять команда с помощью -A

вариант. В этом скрипте мы создаем пять массивов следующим образом:

files содержит имена файлов в каталоге, индексируется по имени файла file_group содержит группу-владельца каждого файла, индексируется по имени файла file_owner содержит владельца каждого файла, индексируется по именам файлов групп содержит количество файлов, принадлежащих проиндексированным владельцам групп содержит количество файлов, принадлежащих проиндексированному владельцу

Строки 7-10: Проверяет, было ли передано допустимое имя каталога в качестве позиционного параметра. В противном случае отображается сообщение об использовании, и сценарий завершается со статусом выхода 1.

Строки 12-20: Просмотрите файлы в каталоге. С помощью состояние В строках 13 и 14 извлекаются имена владельца файла и владельца группы и присваиваются значения их соответствующим массивам (строки 16, 17), используя имя файла в качестве индекса массива. Точно так же само имя файла присваивается файлов массив (строка 15).

Строки 18-19: общее количество файлов, принадлежащих владельцу файла и владельцу группы, увеличивается на единицу.

Строки 22-27: Список файлов выводится. Это делается с помощью раскрытия параметра «$ {array [@]}», которое расширяется до всего списка элементов массива, каждый элемент рассматривается как отдельное слово. Это допускает возможность того, что имя файла может содержать встроенные пробелы. Также обратите внимание, что весь цикл заключен в фигурные скобки, образуя групповую команду. Это позволяет передать весь выходной сигнал цикла в sort команда. Это необходимо, потому что расширение элементов массива не сортируется.

Строки 29-40: Эти два цикла похожи на цикл со списком файлов, за исключением того, что в них используется символ "$ {!"


array [@]} ", которое раскрывается в список индексов массива, а не в список элементов массива.


 

Лучшие облачные вычисления для ОС в OnWorks: