Сценарии Bash - это высокоэффективное средство автоматизации задач, особенно тех, которые используют преимущества других существующих программ. Эта автоматизация часто требует повторения аналогичной операции несколько раз, и именно здесь для цикла вступает в свои права.

Системные администраторы Linux и Mac обычно знакомы со сценариями через терминал, но даже пользователи Windows могут присоединяйтесь к действию с подсистемой Windows для Linux.

Как получить оболочку Linux Bash в Windows 10

Вам не нужно использовать Linux, нет времени, чтобы переключиться на другой компьютер или запустить виртуальную машину? Запустите Linux в Windows 10 с терминалом оболочки Bash!

Как работают скрипты Bash

Сценарий bash - это простой текстовый файл, содержащий серию команд, которые оболочка bash может читать и выполнять. Bash - это оболочка по умолчанию в macOS до Catalina и в большинстве дистрибутивов Linux.

Если вы никогда раньше не работали со сценарием оболочки, вам следует начать с самого простого случая. Это позволит вам отработать ключевые концепции, включая создание сценария и его выполнение.

instagram viewer

Сначала создайте следующий файл в удобном месте (в идеале откройте терминал и сначала перейдите в нужный каталог):

#! / bin / bash
эхо "Привет, мир"

Первая строка сообщает тому, что запускает эту программу, как ее запускать (то есть с помощью интерпретатора bash). Вторая - это просто команда, подобная любой другой, которую вы можете ввести в командной строке. Сохраните этот файл как hello_world.sh, тогда:

$ chmod + x hello_world.sh
$ ./hello_world.sh

В chmod Команда в первой строке делает файл исполняемым, то есть его можно запустить, набрав его имя, как во второй строке.

Если вы видите слова «Hello, World», напечатанные в строке вашего терминала, значит, все работает должным образом.

Как работают циклы For

В общем программировании существует два основных типа цикла for: числовой и для каждого. Числовой тип традиционно является наиболее распространенным, но при использовании bash обычно наоборот.

Числовые циклы for обычно ориентированы на одно целое число, которое определяет, сколько итераций будет выполнено, например:

для (i = 0; я <100; i ++) {
/ * операторы для повторного выполнения * /
}

Это знакомый нам цикл for, который будет повторяться ровно 100 раз, если только i не будет изменен внутри цикла или другой оператор не вызовет остановку выполнения цикла for.

Циклы Foreach, напротив, обычно работают со структурами, такими как списки или массивы, и повторяются для каждого элемента в этой коллекции:

people = ["Петр", "Пол", "Мария"]
foreach (люди как личность) {
if (person == "Paul") {
...
}
}

Некоторые языки используют немного другой синтаксис, который меняет порядок сбора и элемента:

people = ["Петр", "Пол", "Мария"]
для (человек в людях) {
if (person == "Paul") {
...
}
}

For in Loops

В bash foreach или для в- петля встречается чаще. Базовый синтаксис прост:

для аргумента в [список]
делать
/ * операторы для повторного выполнения * /
/ * значение arg можно получить с помощью $ arg * /
сделано

Например, чтобы перебрать три файла с явно указанными именами:

для файла в one.c two.c three.c
делать
ls "$ file"
сделано

Если такие файлы существуют в текущем каталоге, вывод этого сценария будет:

one.c
two.c
three.c

Вместо фиксированного набора файлов список может быть получен с помощью шаблона глобуса (один включает подстановочные знаки - специальные символы, представляющие другие символы). В следующем примере цикл for выполняет итерацию по всем файлам (в текущем каталоге), имена которых заканчиваются на «.xml»:

для файла в формате * .xml
делать
ls -l "$ файл"
сделано

Вот пример вывода:

$ -rw-r - r-- 1 bobby staff 2436 3 ноя 2019 feed.xml
$ -rw-r - r-- 1 Bobby Staff 6447 27 окт., 16:24 sitemap.xml

Это может выглядеть очень скучно:

$ ls -l * .xml

Но есть существенная разница: цикл for выполняет ls программа 2 раза, каждый раз передавая ей одно имя файла. В отдельном примере ls шаблон glob (* .xml) сначала сопоставляет имена файлов, а затем отправляет их все как отдельные параметры командной строки одному экземпляру ls.

Вот пример, в котором используется Туалет (подсчет слов), чтобы разница была более очевидной:

$ wc -l * .xml
44 feed.xml
231 sitemap.xml
275 Всего

В Туалет программа подсчитывает количество строк в каждом файле отдельно, а затем выводит общее количество строк по всем из них. Напротив, если Туалет работает в цикле for:

для файла в формате * .xml
делать
wc -l $ файл
сделано

Вы по-прежнему будете видеть счетчик для каждого файла:

44 feed.xml
231 sitemap.xml

Но нет общей итоговой суммы, потому что Туалет выполняется изолированно при каждой итерации цикла.

Когда список не является списком

При работе с циклами for возникает очень простая и распространенная ошибка, связанная с тем, как bash обрабатывает аргументы / строки в кавычках. Перебирать список файлов нужно так:

для файла в one.c two.c

Не так:

для файла в "one.c two.c"

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

FILES = "one.c two.c"
для файла в $ FILES
делать
...
сделано

Обратите внимание, что само объявление переменной должно заключать свое значение в двойные кавычки!

Без списка

Не имея ничего, что нужно перебирать, цикл for работает с любыми аргументами командной строки, которые были предоставлены сценарию при вызове. Например, если у вас есть сценарий с именем args.sh содержащий следующее:

#! / bin / sh
для
делать
эхо $ а
сделано

Затем выполнение args.sh даст вам следующее:

$ ./args.sh один два три
один
два
три

Баш признает этот случай и лечит для дела как эквивалент за в $ @ делать где $ @ - специальная переменная, представляющая аргументы командной строки.

Эмуляция традиционного числового цикла For

Сценарии Bash часто имеют дело со списками файлов или строками вывода других команд, поэтому часто используется цикл for in. Однако традиционная операция в стиле c по-прежнему поддерживается:

для ((i = 1; я <= 5; я ++))
делать
эхо $ я
сделано

Это классическая форма из трех частей, в которой:

  1. переменная инициализируется (i = 1) при первом обнаружении цикла
  2. цикл продолжается, пока выполняется условие (i <= 5)
  3. каждый раз в цикле переменная увеличивается (i ++)

Итерация между двумя значениями - достаточно распространенное требование, поэтому существует более короткая и менее запутанная альтернатива:

для i в {1..5}
делать
эхо $ я
сделано

Расширение фигурных скобок эффективно переводит приведенный выше цикл for в:

для я в 1 2 3 4

Более точное управление циклом с прерыванием и продолжением

Более сложные циклы for часто нуждаются в способе преждевременного выхода или немедленного перезапуска основного цикла со следующим значением по очереди. Для этого bash заимствует операторы break и continue, которые распространены в других языках программирования. Вот пример, в котором оба метода используются для поиска первого файла длиной более 100 символов:

#! / bin / bash
для файла в *
делать
если [! -f "$ файл"]
тогда
echo "$ file не является файлом"
Продолжить
фи
num_chars = $ (wc -c echo $ file имеет длину «$ num_chars символов»
если [$ num_chars -gt 100]
тогда
echo "Найден $ файл"
перемена
фи
сделано

Цикл for здесь работает со всеми файлами в текущем каталоге. Если файл не является обычным файлом (например, если это каталог), оператор continue используется для перезапуска цикла со следующим файлом по очереди. Если это обычный файл, второй условный блок определит, содержит ли он более 100 символов. В этом случае оператор break используется для немедленного выхода из цикла for (и достижения конца скрипта).

Вывод

Сценарий bash - это файл, содержащий набор инструкций, которые могут быть выполнены. Цикл for позволяет многократно повторять часть скрипта. С помощью переменных, внешних команд и операторов break и continue сценарии bash могут применять более сложную логику и выполнять широкий спектр задач.

Электронное письмо
Ярлыки конфиденциальности приложений Apple могут быть неточными

Отчет предполагает, что ярлыки конфиденциальности приложений Apple могут иметь некоторые проблемы.

Похожие темы
  • Программирование
  • Linux
Об авторе
Бобби Джек (Опубликовано 19 статей)

Бобби - энтузиаст технологий, проработавший разработчиком программного обеспечения большую часть двух десятилетий. Он увлечен играми, работает редактором обзоров в Switch Player Magazine и занимается всеми аспектами онлайн-публикации и веб-разработки.

Ещё от Bobby Jack

Подписывайтесь на нашу новостную рассылку

Подпишитесь на нашу рассылку, чтобы получать технические советы, обзоры, бесплатные электронные книги и эксклюзивные предложения!

Еще один шаг…!

Пожалуйста, подтвердите свой адрес электронной почты в электронном письме, которое мы вам только что отправили.

.