Как использовать цикл For / w Array в скрипте Bash

Неважно кто вы, разработчик ПО, специалист по данным, менеджер ИТ-инфраструктуры или просто любитель компьютеров  —  вам нужно знать, как пользоваться терминалом в Linux и macOS. Но сложность в том, что необходимо запомнить слишком много команд. И если у вас нет чудо-памяти, время от времени приходится искать в Интернете ту или иную команду.

Что такое Bash?

Bash – это, по сути, программа, установленная на компьютере с Linux или Windows, с которой вы можете взаимодействовать. Используя язык оболочки bash, вы можете взаимодействовать с другими программами и заставлять их что-то делать. Популярные оболочки bash включают в себя оболочку C (csh), оболочку Z (zsh), оболочку Korn (ksh) и оболочку Bourne. Хотя они все делают одно и то же, все они используют немного другой язык программирования. Таким образом, хотя все они являются оболочками, команды, отправляемые в оболочку bash, будут немного отличаться от команд, отправляемых в оболочку Korn.

Если вы использовали CMD в Windows или имеете опыт использования Linux, у вас уже будет хорошее представление о том, на что похоже использование bash. Вы вводите команды в текстовое окно, и все происходит. Что именно происходит, зависит от команд, которые вы вводите.

Общие команды bash включают в себя:

  • cat: отображать содержимое в файле или объединять два файла вместе.
  • ls: список файлов или папок в каталоге.
  • pwd: Показать путь к текущему каталогу.
  • chmod: изменить или изменить права доступа к файлу.
  • chown: изменить владельца файла или сценария.
  • mkdir: создать каталог.
  • mv: переместить файл или папку из одного каталога в другой.
  • rm: удалить (удалить) файл или каталог.
  • CD: изменить текущий рабочий каталог.
  • выход: закрыть или выйти из терминала.

Переменные

Переменные в bash могут содержаться в 3х областях видимости:

  1. Локальные переменные; Простая переменная внутри конкретного сценария. Например, определение переменной, доступ к значению и удаление:

    path=»/home/user/stas/» echo -n $path # вывести значение переменной unset path # удалить переменную

    Также, вы можете объявить локальную переменную внутри функции. Такая переменная будет доступна только внутри этой ф-ции:

    local my_var;

  2. Переменные окружения (подробнее); Этот тип переменных доступен любой программе (сценарию), которая запущена из данной оболочки. Разместить переменную в окружении можно командой export:

    export var_name

  3. Переменные оболочки; Это переменные имеют имена порядкового номера ($1, $2, ..) и содержат аргументы, переданные сценарию при запуске, например:

    ./some_ VAL1 VAL2 # внутри сценария

    $0 имя скрипта $1 VAL1 $2 VAL2 [email protected] Содержит все аргументы командной строки $# Количество аргументов

Подстановка параметров и результата работы команд

Механизм подстановки команды (заключенная в апострофы или круглые скобки $(command) команды вернет значение в переменную, завершающие символы новой строки удаляются):

current_date=`date +%Y-%m-%d` # OR # current_date=$(date +%Y-%m-%d) echo $current_date # 2013-10-05

Получить результат значение переменной в другую переменную:

var=${arr[*]} # все элементы массива

Примечание

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

Арифметика:

$(( арифметика ))

Раскрытие фигурных скобок

Раскрытие фигурных скобок — это механизм, с помощью которого можно генерировать строки произвольного вида. Генерация строки по шаблону (фигурные скобки могут быть вложенными):

echo sp{el,il,al}l #> spell spill spall

Команды, синтаксис и примеры

Напишите сценарий bash, чтобы он получал аргументы, которые указываются при вызове сценария из командной строки. Используйте этот метод, когда сценарий должен выполнять немного другую функцию в зависимости от значений входных параметров, также называемых аргументами.

Пример передачи аргументов в скрипте Bash

Скажем, у вас есть скрипт , который считает слова в файле. Если вы хотите использовать этот сценарий для многих файлов, лучше передать имя файла в качестве аргумента, чтобы один и тот же сценарий можно было использовать для всех файлов, которые будут обрабатываться. Например, если имя файла для обработки – список песен, введите в командной строке следующее:

sh список песен

Доступ к аргументам осуществляется внутри скрипта с использованием переменных $ 1 , $ 2 , $ 3 и т. Д. Переменная $ 1 ссылается на первый аргумент, $ 2 – на второй аргумент, а $ 3 – на третий аргумент. Это иллюстрируется в следующем примере:

FILE1 = $ 1 wc $ FILE1

Для удобства чтения назначьте переменную с описательным именем значению первого аргумента ( $ 1 ), а затем вызовите утилиту подсчета слов (wc) для переменной $ FILE1 ,

Если у вас есть переменное число аргументов, используйте переменную $ @ , которая является массивом всех входных параметров. Это использует цикл for для итеративной обработки каждого из них, как показано в следующем примере:

для FILE1 в «$ @» do wc $ FILE1 сделано

Вот пример того, как вызвать этот скрипт с аргументами из командной строки:

sh songlist1 songlist2 songlist3

Если аргумент имеет пробелы, заключите его в одинарные кавычки. Например:

sh ‘songlist 1’ ‘songlist 2’ ‘songlist 3’

Флаги Метод

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

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

makereport -u jsmith -p notebooks -d 10-20-2011 -f pdf

Bash включает эту функцию с помощью функции getopts. Для приведенного выше примера используйте getopts следующим образом:

, пока getopts u: d: p: f: option do case «$ {option}» in u) USER = $ {OPTARG} ;; < br /> d) DATE = $ {OPTARG} ;; p) PRODUCT = $ {OPTARG} ;; f) FORMAT = $ OPTARG ;; esac выполнено < br />

Это цикл while, который использует функцию getopts и так называемую строку опций – в данном случае u: d: p: f: – для итерации аргументов. Цикл while проходит по строке optstring, которая содержит флаги, используемые для передачи аргументов, и присваивает значение аргумента, предоставленное для этого флага, переменной option . Затем оператор CASE присваивает значение переменной option глобальной переменной, которая используется после прочтения всех аргументов.

Значения для двоеточий

Двоеточие в строке опций означает, что значения необходимы для соответствующих флагов. В приведенном выше примере u: d: p: f: за всеми флагами следует двоеточие. Это означает, что все флаги нуждаются в значении. Если, например, флаги d и f , как ожидается, не будут иметь значения, строкой опций будет u: dp: f .

Двоеточие в начале строки опций (например, : u: d: p: f: ) имеет совершенно другое значение. Он обрабатывает флаги, которые не представлены в строке optstring. В этом случае значение переменной option установлено в ? и значение OPTARG устанавливается на неожиданный флаг. Это отображает подходящее сообщение об ошибке, информирующее вас об ошибке.

Аргументы, которым не предшествует флаг, игнорируются getopts. Если флаги, указанные в строке опций, не предоставляются при вызове скрипта, то ничего не происходит, если вы специально не обработаете этот случай в своем коде. Любые аргументы, не обрабатываемые getops, могут по-прежнему регистрироваться с помощью обычных переменных $ 1 , $ 2 и $ 3 .

Чтение параметров командной строки в BASH-скрипте

При запуске BASH-скрипта с параметрами, эти параметры помещаются в специальные переменные, которые также называют позиционными параметрами:

  • в переменную $0 попадает имя вызываемого скрипта
  • в переменную $1 попадает первый параметр
  • в переменную $2 попадает второй параметр
  • … и так далее, до
  • в переменную $9 попадает девятый параметр

Посмотрим на примере, написав простой скрипт:

#!/bin/bash echo ‘Имя скрипта: ‘ $0 echo ‘1-й параметр: ‘ $1 echo ‘2-й параметр: ‘ $2 echo ‘3-й параметр: ‘ $3 echo ‘4-й параметр: ‘ $4

Результатом его работы будут следующие данные:

[email protected]:~# ./ parameter $number ‘просто строка’ 12 Имя скрипта: ./ 1-й параметр: parameter 2-й параметр: просто строка 3-й параметр: 12 4-й параметр:

Как видно, если передавать переменную, значение которой не определено, этот параметр просто не учитывается и не попадает в позиционные параметры. Однако, это должно сработать, если назначить этой переменной значение:

[email protected]:~# read number Поместим_значение_в_переменную_number

То получим её значение, которое попадёт во второй позиционный параметр:

[email protected]:~# ./ parameter $number ‘просто строка’ 12 Имя скрипта: ./ 1-й параметр: parameter 2-й параметр: Поместим_значение_в_переменную_number 3-й параметр: просто строка 4-й параметр: 12

Важное замечание:Передаваемые значения не должны иметь пробелов, так как пробелы используются в качестве разделителя передаваемых BASH-скрипту переменных!

Для того, чтобы передать значение в переменной с пробелами, её нужно заключить между двумя двойными кавычками. В нашем примере так «$number»

[email protected]:~# read number Поместим значение в переменную $number

[email protected]:~# ./ parameter «$number» ‘просто строка’ 12 Имя скрипта: ./ 1-й параметр: parameter 2-й параметр: Поместим значение в переменную $number 3-й параметр: просто строка 4-й параметр: 12

Важное замечание:Если BASH-скрипту надо больше девяти параметров, при обращении к ним номер в имени переменной надо заключать в фигурные скобки, например: ${12}

Переменные и путь

Можно двумя способами определить переменные внутри оболочки: в реальном времени, написав в терминале соответствующую команду, или же определить их в файле .bashrc в домашний каталог, где они будут храниться вечно.

echo «hello» # вывод hello на консоль echo $USER # вывод значение переменной USER на консоль env # вывод список всех переменных окружения set # вывод список всех локальных переменных MY_FRIENDS=William # создать локальную переменную MY_FRIENDS MY_FRIENDS=$MY_FRIENDS:John:Anna # объединение значения ‘John’ и ‘Anna’ в MY_FRIENDS export MY_FRIENDS # сделать локальную переменную MY_FRIENDS переменной окружения unset MY_FRIENDS # удалить переменную MY_FRIENDS

Ещё один интересный инструмент  —  alias (псевдоним), сокращение для длинных команд. Посмотрим, как он строится:

alias clone_my_repo = «git clone » # создать псевдоним

Для тех, кто не знает, путь (Path) – это каталоги, в которых ОС ищет файлы для исполнения. С его помощью можно запустить файл, написав лишь название, даже не нужно знать его расположение. Кроме того, в путь можно добавить папку, а также найти каталог, где находится исполняемый файл, с помощью команд:

export PATH=$PATH:/home/john/myprogram # добавление каталога к пути /home/john/myprogram which nano # отобразить расположение исполняемого файла «nano» whereis nano # отобразить расположение исполняемого файла, справочных страниц, исходного кода и т.д. «nano»

Математические операции

Команда let. Команда let производит арифметические операции над числами и переменными. Рассмотрим небольшой пример, в котором мы производим некоторые вычисления над введенными числами:

#!/bin/bash echo "Введите a: " read a echo "Введите b: " read b let "c = a + b" #сложение echo "a+b= $c" let "c = a / b" #деление echo "a/b= $c" let "c <<= 2" #сдвигает c на 2 разряда влево echo "c после сдвига на 2 разряда: $c" let "c = a % b" # находит остаток от деления a на b echo "$a / $b. остаток: $c "

Результат выполнения:

$ ./bash2_ Введите a: 123 Введите b: 12 a+b= 135 a/b= 10 c после сдвига на 2 разряда: 40 123 / 12. остаток: 3

Ну вот, как видите ничего сложного, список математических операций стандартный:

+ — сложение — — вычитание * — умножение / — деление ** — возведение в степень % — модуль(деление по модулю), остаток от деления let позволяет использовать сокращения арифметических команд, тем самым сокращая кол-во используемых переменных. Например: a = a+b эквивалентно a +=b и т.д

Основные команды для написания bash скрипта

Существует ряд встроенных команд, которые используются для создания скриптов:

  • break — выход из цикла for, while или until
  • continue — выполнение следующей итерации цикла for, while или until
  • echo — вывод аргументов, разделенных пробелами, на стандартное устройство вывода
  • exit — выход из оболочки
  • export — отмечает аргументы как переменные для передачи в дочерние процессы в среде
  • hash — запоминает полные имена путей команд, указанных в качестве аргументов, чтобы не искать их при следующем обращении
  • kill — посылает сигнал завершения процессу
  • pwd — выводит текущий рабочий каталог
  • read — читает строку из ввода оболочки и использует ее для присвоения значений указанным переменным.\
  • return — заставляет функцию оболочки выйти с указанным значением
  • shift — перемещает позиционные параметры налево
  • test — вычисляет условное выражение
  • times — выводит имя пользователя и системное время, использованное оболочкой и ее потомками
  • trap — указывает команды, которые должны выполняться при получении оболочкой сигнала
  • unset — вызывает уничтожение переменных оболочки
  • wait — ждет выхода из дочернего процесса и сообщает выходное состояние

Цикл while

Вот схема организации циклов while while команда проверки условия do другие команды done

Взглянем на пример скрипта с таким циклом:

#!/bin/bash var1=5 while [ $var1 -gt 0 ] do echo $var1 var1=$[ $var1 — 1 ] done На входе в цикл проверяется, больше ли нуля переменная $var1 . Если это так, выполняется тело цикла, в котором из значения переменной вычитается единица. Так происходит в каждой итерации, при этом мы выводим в консоль значение переменной до его модификации. Как только $var1 примет значение 0, цикл прекращается.

Результат работы цикла while

Если не модифицировать переменную $var1 , это приведёт к попаданию скрипта в бесконечный цикл.

История изменений

История изменений

Учтены пожелания читателей: исправлены объяснения команды shift в главе 9, опечатки в главе 7, главе 3, главе 10.

Учтены пожелания читателей.

Изменен адрес

Вставлены замечания читателей, с помощью тегов DocBook добавлен индекс.

Пояснен пример в главе 4, скорректировано описание встраиваемых документов (here doc) в главе 9, общая проверка и исправление типографских ошибок, добавлены ссылки на китайский и украинский переводы, замечание и прочее об awk в главе 6.

Исправлены типографские ошибки в главе 3, 6 и 7, добавлены замечания пользователей, добавлено замечание в главе 7.

Немного об отладке, добавлено несколько ключевых слов, информация о новом Bash 3.0, добавлено изображение.

Первоначальный релиз для LDP; больше примеров, больше пометок, меньше ошибок и описок, добавлен глоссарий

Revision

Читайте также:  Как обойти блокировку сайта: ТОР и ВПН