Bash изменить значение переменной в файле

Обновлено: 13.05.2024

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

Подстановка переменных

Важно понимать разницу между именем переменной и значением этой переменной, и не забывать о ней. Например: variable -- это символическое имя переменной
в то время как $variable -- это уже ссылка на значение переменной ( на область памяти, содержащую значение переменной с именем variable ). Имена переменных, без префикса $, могут использоваться в процессе объявления переменной, то есть когда переменной присваивается определенное значение, при удалении значения переменной, при экспорте и в случаях -- когда переменная является названием сигнала.
Присвоить значение переменной можно с помощью оператора =:

различными вариантами с использованием оператора read:

или в заголовке цикла:

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

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

Форма записи $var, является упрощенным вариантом $ . Запись с фигурными скобками $ , является более строгим вариантом, ее можно применять там, где обычный вариант вызывает синтаксическую ошибку.

Примеры назначения и подстановки переменных

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

Объявление неинициализированной переменной, фактически то-же самое что и сброс переменной

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

Допускается присвоение значений нескольким переменным в одной строке.

Со старыми версиями "sh" могут возникнуть проблемы .

Присваивание значений переменным

Операцией присвоения значения переменной в bash является символ равно, "=", в зависимости от контекста использования так-же является оператором сравнения "равно".

Простое присваивание

Простое и замаскированное присваивание

Обратите внимание на восклицательный знак (!) в подстанавливаемой команде, из командной строки такой вариант работать не будет, поскольку здесь используется механизм истории команд bash. Но в сценариях использование истории команд запрещено


Присваивание значений переменным подстановкой команд с использованием конструкции $(. ), более современный метод, нежели подстановка команд с помощью обратных кавычек.

Переменные Bash не имеют определенного типа

В отличие от большинства других языков программирования, Bash не разделяет переменные по типам. По сути, переменные Bash являются строковыми переменными, но, в зависимости от контекста, Bash допускает целочисленную арифметику с переменными. Определяющим фактором здесь служит содержимое переменных.

Целое число или строка

Переменные не имеющие типов, палка о двух концах, с одной стороны они делают сценарии более гибкими и упрощают чтение кода, с другой могут приводить к неожиданным ошибкам и развивают в человеке "неряшливость" в программировании, кроме того вся ответственность за отслеживание типов переменных полностью ложится на программиста.

Специальные типы переменных

локальные переменные

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

переменные окружения

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

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

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

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

Если сценарий меняет переменные окружения, они должны быть экспортированы, т.е передаться окружению, локальному по отношению к сценарию. Делается это с помощью команды export.

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

Позиционные параметры

Позиционные параметры, это аргументы, получаемые сценарием при запуске из командной строки — $0, $1, $2, $3. где $0 — это название файла сценария, $1 — первый аргумент, $2 — второй, $3 — третий и так далее. Аргументы, следующие за $9, должны быть заключены в фигурные скобки, например: $ , $ , $ .

Специальные переменные $* и $@ содержат все поступившие в сценарий позиционные параметры.

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

Сценарий может вести себя по разному в зависимости от имени сценария. Для этого сценарий должен проанализировать аргумент $0 — имя файла сценария. Это могут быть и имена символических ссылок на файл сценария.

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

Сценарий использующий программу whois для определения имени домена

Команда shift сдвигает позиционные параметры удаляя первый из них.

$1 <--- $2, $2 <--- $3, $3 <--- $4, и т.д.

При этом аргумент $0 (имя сценария) остается без изменений. Если вашему сценарию передается большое количество аргументов из командной строки, команда shift позволяет получить доступ к аргументам, с порядковым номером больше 9, без использования фигурных скобок.

Использование команды shift

В данном случае команда 'shift используется для перебора всех аргументов командной строки.

Так-же, команда shift, может применяться и к входным аргументам функций.

Favorite

Добавить в избранное

Главное меню » Linux » Как заменить строку в файле в Bash

(1 оценок, среднее: 5,00 из 5)

Bash Heredoc

К ак программисту вам может потребоваться работать с разными типами файлов для временного или постоянного хранения данных. Иногда вам может потребоваться заменить часть файла или изменить конкретное содержимое файла. Чтобы заменить содержимое в файле, вы должны найти конкретную строку файла. Команда sed используется для замены любой строки в файле с помощью сценария bash. Эту команду можно использовать различными способами для замены содержимого файла в bash. Команда AWK также может быть использована для замены строки в файле. В этой статье показано, как заменить любое строковое значение из файла с помощью сценария bash. Для отображения операций замены создается текстовый файл с именем Sales.txt со следующим содержимым.

Заменить строку в файле командой `sed`

Каждая часть приведенного выше синтаксиса объясняется ниже.

search_string содержит строковое значение, которое будет искать в файле для замены.

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

Пример 1: заменить файл командой sed

В следующем скрипте текст для поиска и замены будет взят у пользователя. Если строка поиска существует в Sales.txt, она будет заменена строкой замены. Здесь будет выполняться поиск с учетом регистра.

Пример 2: Замена файла командой sed с флагом g и i

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

Пример 3. Замена файла командой sed и шаблоном совпадающих цифр

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

Заменить строку в файле командой awk

Читать Как настроить оболочку Bash с помощью команды shopt

Пример 4: заменить файл командой awk

Следующий скрипт сохранит обновленное содержимое в файле temp.txt, который будет переименован в исходный файл.

Вывод

В этой статье показано, как использовать сценарии bash для замены определенных строк в файле. Задача по замене строки в файле станет для вас проще после отработки приведенных выше примеров.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Терминал Linux с зеленым текстом на ноутбуке.

Переменные имеют жизненно важное значение, если вы хотите написать сценарии и понять, что этот код, который вы собираетесь вырезать и вставить из Интернета, сделает на вашем компьютере с Linux. Мы начнем!

Переменные 101

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

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

Примеры

Здесь мы создадим пять переменных. Формат заключается в вводе имени, знака равенства = и значения. Обратите внимание, что нет пробела до или после знака равенства. Присвоение переменной значения часто называется присвоением значения переменной.

Мы создадим четыре строковые переменные и одну числовую переменную this_year:

Пять переменных в окне терминала.

Чтобы увидеть значение в переменной, используйте команду echo . Имя переменной должно предшествовать знаку доллара $ каждый раз, когда вы ссылаетесь на содержащееся в нем значение, как показано ниже:

Команда "echo", отображающая значения переменных в окне терминала.

Давайте использовать все наши переменные одновременно:

"Echo" $ my_boost - это $ me, как $ his_boost - это команда $ him (c) $ this_year "в окне терминала.

Значения переменных заменяют их имена. Вы также можете изменить значения переменных. Чтобы назначить новое значение переменной my_boost , вы просто повторяете то, что делали, когда присваивали первое значение, например:

Переменная my_boost = Tequila в окне терминала.

Если вы повторно запустите предыдущую команду, вы получите другой результат:

Эхо-команда "$ my_boost - это $ me, как $ his_boost - это $ $ (c) $ this_year" в окне терминала.

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

Мы поговорим о цитировании переменных позже. На данный момент вот некоторые вещи, которые нужно запомнить:

  • Переменная в одинарных кавычках ' обрабатывается как буквенная строка, а не как переменная.
  • Переменные в кавычках " рассматриваются как переменные.
  • Чтобы получить значение, хранящееся в переменной, необходимо указать знак доллара $ .
  • Переменная без знака доллара $ предоставляет только имя переменной.

Правильные и неправильные примеры обращения к переменным в окне терминала.

Вы также можете создать переменную, которая берет свое значение из существующей переменной или числа переменных. Следующая команда определяет новую переменную с именем drink_of_the_Year, и присваивает ей объединенные значения переменных my_boost и this_year :

Как использовать переменные в скриптах

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

Введите это в текстовый файл, а затем сохраните его как fcnt.sh (для «подсчета файлов»):

Прежде чем вы сможете запустить скрипт, вы должны сделать его исполняемым, как показано ниже:

"chmod + x fcnt.sh" в окне терминала.

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

"./fcnt.sh" в окне терминала.

Это печатает количество файлов в каталоге /dev . Вот как это работает:

  • Определена переменная с именем folder_to_count , и она содержит строку «/ dev».
  • Другая переменная, названная file_count , определена. Эта переменная берет свое значение из подстановки команд. Это командная фраза в скобках $( ) . Обратите внимание, что перед первой скобкой стоит знак доллара $ . Эта конструкция $( ) оценивает команды в скобках, а затем возвращает их окончательное значение. В этом примере это значение присваивается переменной file_count . Что касается переменной file_count , ей передается значение для хранения; это не касается того, как было получено значение.
  • Команда, вычисленная в подстановке команд, выполняет листинг файла ls в каталоге в переменной folder_to_count , для которой задано значение «/ dev». Таким образом, сценарий выполняет команду «ls / dev».
  • Выходные данные этой команды передаются в команду wc . Опция -l (количество строк) заставляет wc подсчитывать количество строк в выводе команды ls . Поскольку каждый файл указан в отдельной строке, это количество файлов и подкаталогов в каталоге «/ dev». Это значение присваивается переменной file_count .
  • Последняя строка использует echo для вывода результата.

Но это работает только для каталога «/ dev». Как мы можем заставить скрипт работать с любым каталогом? Все, что нужно, это одно небольшое изменение.

Как использовать параметры командной строки в скриптах

Многие команды, такие как ls и wc , принимают параметры командной строки. Они предоставляют информацию команде, поэтому она знает, что вы хотите от нее сделать. Если вы хотите, чтобы ls работал с вашим домашним каталогом, а также отображал скрытые файлы , вы можете использовать следующую команду, где опции tilde

и -a (all) являются параметрами командной строки:

Наши скрипты могут принимать параметры командной строки. На них ссылаются как $1 за первый параметр, $2 за второй, и так далее, до $9 за девятый параметр. (На самом деле, также есть $0 , но он зарезервирован, чтобы всегда содержать скрипт.)

Вы можете ссылаться на параметры командной строки в скрипте так же, как и на обычные переменные. Давайте изменим наш скрипт, как показано ниже, и сохраним его под новым именем fcnt2.sh :

На этот раз переменной folder_to_count присваивается значение первого параметра командной строки, $1 .

Остальная часть сценария работает точно так же, как и раньше. Вместо конкретного решения ваш сценарий теперь является общим. Вы можете использовать его в любом каталоге, потому что он не жестко запрограммирован для работы только с «/ dev».

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

"chmod + x fcnt2.sh" в окне терминала.

Теперь попробуйте это с несколькими каталогами. Вы можете сначала выполнить команду «/ dev», чтобы убедиться, что вы получите тот же результат, что и раньше. Введите следующее:

«./fnct2.sh / dev» в окне терминала.

Вы получите тот же результат (207 файлов), что и ранее для каталога «/ dev». Это обнадеживает, и вы получаете специфичные для каталога результаты для каждого из других параметров командной строки.

Чтобы сократить скрипт, вы можете вообще отказаться от переменной folder_to_count и просто ссылаться на $1 , как folder_to_count ниже:

Работа со специальными переменными

Мы упомянули $0 , для которого всегда указывается имя файла скрипта. Это позволяет вам использовать скрипт для правильной печати его имени, даже если он переименован. Это полезно при регистрации событий, в которых вы хотите узнать имя процесса, который добавил запись.

Ниже приведены другие специальные заданные переменные:

Вы хотите увидеть их все в одном сценарии? Вы можете! Сохраните следующее как текстовый файл с именем special.sh :

Введите следующее, чтобы сделать его исполняемым:

"chmod + x special.sh" в окне терминала.

Теперь вы можете запустить его с кучей различных параметров командной строки, как показано ниже.

«./special.sh alpha bravo charlie 56 2048 четверг» в окне терминала.

Переменные среды

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

Чтобы увидеть переменные активной среды в вашем сеансе Bash, используйте эту команду:

Команда "env | less" в окне терминала

Если вы прокрутите список, вы можете найти некоторые, которые будут полезны для ссылок в ваших сценариях.

Список переменных активной среды в окне терминала.

Как экспортировать переменные

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

Сначала сохраните следующее с именем script_one.sh :

Это создает две переменные, first_var и second_var , и назначает некоторые значения. Он выводит их в окно терминала, экспортирует переменные и вызывает script_two.sh . Когда script_two.sh завершается, и поток процесса возвращается к этому сценарию, он снова печатает переменные в окне терминала. Затем вы можете увидеть, изменились ли они.

Второй скрипт, который мы будем использовать, это script_two.sh . Это скрипт, который вызывает script_one.sh . Введите следующее:

Этот второй сценарий печатает значения двух переменных, присваивает им новые значения, а затем печатает их снова.

Чтобы запустить эти сценарии, вы должны ввести следующее, чтобы сделать их исполняемыми:

«chmod + x script_one.sh» и «chmod + x script_two.sh» в окне терминала.

А теперь введите следующее для запуска script_one.sh :

Вот что говорит нам результат:

  • script_one.sh печатает значения переменных, которые являются альфа и браво.
  • script_two.sh печатает значения переменных (альфа и браво) по мере их получения.
  • script_two.sh меняет их на Чарли и Дельта.
  • script_one.sh печатает значения переменных, которые по-прежнему являются альфа и браво.

То, что происходит во втором сценарии, остается во втором сценарии. Это похоже на то, что копии переменных отправляются во второй скрипт, но они отбрасываются при выходе из этого скрипта. Исходные переменные в первом скрипте не изменяются ничем, что происходит с их копиями во втором.

Как процитировать переменные

Вы могли заметить, что когда скрипты ссылаются на переменные, они заключаются в кавычки " . Это позволяет правильно ссылаться на переменные, поэтому их значения используются при выполнении строки в скрипте.

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

"site_name = How-To Geek" в окне терминала.

Bash видит пробел перед «Geek» как указание на запуск новой команды. Он сообщает, что такой команды нет, и покидает линию. echo показывает нам, что переменная site_name ничего не содержит, даже текст «How-To».

Попробуйте еще раз с кавычками вокруг значения, как показано ниже:

site_name = "How-To Geek" в окне терминала.

На этот раз оно распознается как одно значение и правильно site_name переменной site_name .

эхо твой друг

Может потребоваться некоторое время, чтобы привыкнуть к подстановке команд, заключению в кавычки переменных и запоминанию, когда включать знак доллара.

Прежде чем нажать Enter и выполнить строку команд Bash, попробуйте выполнить команду echo перед ней. Таким образом, вы можете быть уверены, что то, что должно произойти, это то, что вы хотите. Вы также можете отследить любые ошибки, которые могли допустить в синтаксисе.

Сегодня поговорим о bash-скриптах. Это — сценарии командной строки, написанные для оболочки bash. Существуют и другие оболочки, например — zsh, tcsh, ksh, но мы сосредоточимся на bash. Этот материал предназначен для всех желающих, единственное условие — умение работать в командной строке Linux.




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


Итак, если говорить о командной строке, она позволяет выполнить несколько команд за один раз, введя их через точку с запятой:


На самом деле, если вы опробовали это в своём терминале, ваш первый bash-скрипт, в котором задействованы две команды, уже написан. Работает он так. Сначала команда pwd выводит на экран сведения о текущей рабочей директории, потом команда whoami показывает данные о пользователе, под которым вы вошли в систему.

Используя подобный подход, вы можете совмещать сколько угодно команд в одной строке, ограничение — лишь в максимальном количестве аргументов, которое можно передать программе. Определить это ограничение можно с помощью такой команды:


Командная строка — отличный инструмент, но команды в неё приходится вводить каждый раз, когда в них возникает необходимость. Что если записать набор команд в файл и просто вызывать этот файл для их выполнения? Собственно говоря, тот файл, о котором мы говорим, и называется сценарием командной строки.

Как устроены bash-скрипты

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


В других строках этого файла символ решётки используется для обозначения комментариев, которые оболочка не обрабатывает. Однако, первая строка — это особый случай, здесь решётка, за которой следует восклицательный знак (эту последовательность называют шебанг) и путь к bash , указывают системе на то, что сценарий создан именно для bash .

Команды оболочки отделяются знаком перевода строки, комментарии выделяют знаком решётки. Вот как это выглядит:


Тут, так же, как и в командной строке, можно записывать команды в одной строке, разделяя точкой с запятой. Однако, если писать команды на разных строках, файл легче читать. В любом случае оболочка их обработает.

Установка разрешений для файла сценария

Сохраните файл, дав ему имя myscript , и работа по созданию bash-скрипта почти закончена. Сейчас осталось лишь сделать этот файл исполняемым, иначе, попытавшись его запустить, вы столкнётесь с ошибкой Permission denied .


Попытка запуска файла сценария с неправильно настроенными разрешениями

Сделаем файл исполняемым:


Теперь попытаемся его выполнить:


После настройки разрешений всё работает как надо.


Успешный запуск bash-скрипта

Для вывода текста в консоль Linux применяется команда echo . Воспользуемся знанием этого факта и отредактируем наш скрипт, добавив пояснения к данным, которые выводят уже имеющиеся в нём команды:


Вот что получится после запуска обновлённого скрипта.


Теперь мы можем выводить поясняющие надписи, используя команду echo . Если вы не знаете, как отредактировать файл, пользуясь средствами Linux, или раньше не встречались с командой echo , взгляните на этот материал.

Использование переменных

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

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

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

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

Переменные среды

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


Обратите внимание на то, что мы можем использовать системную переменную $HOME в двойных кавычках, это не помешает системе её распознать. Вот что получится, если выполнить вышеприведённый сценарий.


Использование переменной среды в сценарии

А что если надо вывести на экран значок доллара? Попробуем так:


Система обнаружит знак доллара в строке, ограниченной кавычками, и решит, что мы сослались на переменную. Скрипт попытается вывести на экран значение неопределённой переменной $1 . Это не то, что нам нужно. Что делать?

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


Теперь сценарий выведет именно то, что ожидается.


Использование управляющей последовательности для вывода знака доллара

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

В дополнение к переменным среды, bash-скрипты позволяют задавать и использовать в сценарии собственные переменные. Подобные переменные хранят значение до тех пор, пока не завершится выполнение сценария.

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

Вот что получится после запуска такого сценария.


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

Подстановка команд

Одна из самых полезных возможностей bash-скриптов — это возможность извлекать информацию из вывода команд и назначать её переменным, что позволяет использовать эту информацию где угодно в файле сценария.

Сделать это можно двумя способами.

  • С помощью значка обратного апострофа «`»
  • С помощью конструкции $()


При втором подходе то же самое записывают так:


А скрипт, в итоге, может выглядеть так:


В ходе его работы вывод команды pwd будет сохранён в переменной mydir , содержимое которой, с помощью команды echo , попадёт в консоль.


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

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

Для выполнения математических операций в файле скрипта можно использовать конструкцию вида $((a+b)) :


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

Управляющая конструкция if-then

В некоторых сценариях требуется управлять потоком исполнения команд. Например, если некое значение больше пяти, нужно выполнить одно действие, в противном случае — другое. Подобное применимо в очень многих ситуациях, и здесь нам поможет управляющая конструкция if-then . В наиболее простом виде она выглядит так:


А вот рабочий пример:


В данном случае, если выполнение команды pwd завершится успешно, в консоль будет выведен текст «it works».

Воспользуемся имеющимися у нас знаниями и напишем более сложный сценарий. Скажем, надо найти некоего пользователя в /etc/passwd , и если найти его удалось, сообщить о том, что он существует.


Вот что получается после запуска этого скрипта.


Поиск пользователя

Здесь мы воспользовались командой grep для поиска пользователя в файле /etc/passwd . Если команда grep вам незнакома, её описание можно найти здесь.

Управляющая конструкция if-then-else

Для того, чтобы программа смогла сообщить и о результатах успешного поиска, и о неудаче, воспользуемся конструкцией if-then-else . Вот как она устроена:


Если первая команда возвратит ноль, что означает её успешное выполнение, условие окажется истинным и выполнение не пойдёт по ветке else . В противном случае, если будет возвращено что-то, отличающееся от нуля, что будет означать неудачу, или ложный результат, будут выполнены команды, расположенные после else .

Напишем такой скрипт:


Его исполнение пошло по ветке else .


Запуск скрипта с конструкцией if-then-else


Если первая команда вернёт ноль, что говорит о её успешном выполнении, выполнятся команды в первом блоке then , иначе, если первое условие окажется ложным, и если вторая команда вернёт ноль, выполнится второй блок кода.


В подобном скрипте можно, например, создавать нового пользователя с помощью команды useradd , если поиск не дал результатов, или делать ещё что-нибудь полезное.

Сравнение чисел

В скриптах можно сравнивать числовые значения. Ниже приведён список соответствующих команд.

n1 -eq n2 Возвращает истинное значение, если n1 равно n2 .
n1 -ge n2 Возвращает истинное значение, если n1 больше или равно n2 .
n1 -gt n2 Возвращает истинное значение, если n1 больше n2 .
n1 -le n2 Возвращает истинное значение, если n1 меньше или равно n2 .
n1 -lt n2 Возвращает истинное значение, если n1 меньше n2 .
n1 -ne n2 Возвращает истинное значение, если n1 не равно n2 .

В качестве примера опробуем один из операторов сравнения. Обратите внимание на то, что выражение заключено в квадратные скобки.


Вот что выведет эта команда.


Сравнение чисел в скриптах

Сравнение строк

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

str1 = str2 Проверяет строки на равенство, возвращает истину, если строки идентичны.
s tr1 != str2 Возвращает истину, если строки не идентичны.
str1 < str2 Возвращает истину, если str1 меньше, чем str2 .
str1 > str2 Возвращает истину, если str1 больше, чем str2 .
-n str1 Возвращает истину, если длина str1 больше нуля.
-z str1 Возвращает истину, если длина str1 равна нулю.

Вот пример сравнения строк в сценарии:


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


Сравнение строк в скриптах

Вот как работа с этими операторами выглядит в коде:


Вот результаты работы скрипта.


Сравнение строк, выведенное предупреждение

Обратите внимание на то, что скрипт, хотя и выполняется, выдаёт предупреждение:


Для того, чтобы избавиться от этого предупреждения, заключим $val2 в двойные кавычки:


Теперь всё работает как надо.


Сравнение строк

Ещё одна особенность операторов «>» и «<» заключается в том, как они работают с символами в верхнем и нижнем регистрах. Для того, чтобы понять эту особенность, подготовим текстовый файл с таким содержимым:


Сохраним его, дав имя myfile , после чего выполним в терминале такую команду:


Она отсортирует строки из файла так:


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


Если его запустить, окажется, что всё наоборот — строчная буква теперь больше прописной.


Команда sort и сравнение строк в файле сценария

В командах сравнения прописные буквы меньше строчных. Сравнение строк здесь выполняется путём сравнения ASCII-кодов символов, порядок сортировки, таким образом, зависит от кодов символов.

Команда sort , в свою очередь, использует порядок сортировки, заданный в настройках системного языка.

Проверки файлов

Пожалуй, нижеприведённые команды используются в bash-скриптах чаще всего. Они позволяют проверять различные условия, касающиеся файлов. Вот список этих команд.

-d file Проверяет, существует ли файл, и является ли он директорией.
-e file Проверяет, существует ли файл.
-f file Проверяет, существует ли файл, и является ли он файлом.
-r file Проверяет, существует ли файл, и доступен ли он для чтения.
-s file П роверяет, существует ли файл, и не является ли он пустым.
-w file Проверяет, существует ли файл, и доступен ли он для записи.
-x file Проверяет, существует ли файл, и является ли он исполняемым.
file1 -nt file2 Проверяет, новее ли file1 , чем file2 .
file1 -ot file2 Проверяет, старше ли file1 , чем file2 .
-O file Проверяет, существует ли файл, и является ли его владельцем текущий пользователь.
-G file Проверяет, существует ли файл, и соответствует ли его идентификатор группы идентификатору группы текущего пользователя.

Эти команды, как впрочем, и многие другие рассмотренные сегодня, несложно запомнить. Их имена, являясь сокращениями от различных слов, прямо указывают на выполняемые ими проверки.

Опробуем одну из команд на практике:


Этот скрипт, для существующей директории, выведет её содержимое.


Вывод содержимого директории

Полагаем, с остальными командами вы сможете поэкспериментировать самостоятельно, все они применяются по тому же принципу.

Итоги

Сегодня мы рассказали о том, как приступить к написанию bash-скриптов и рассмотрели некоторые базовые вещи. На самом деле, тема bash-программирования огромна. Эта статья является переводом первой части большой серии из 11 материалов. Если вы хотите продолжения прямо сейчас — вот список оригиналов этих материалов. Для удобства сюда включён и тот, перевод которого вы только что прочли.

    — здесь речь идёт о том, как начать создание bash-скриптов, рассмотрено использование переменных, описаны условные конструкции, вычисления, сравнения чисел, строк, выяснение сведений о файлах.

— тут раскрываются особенности работы с циклами for и while.

— этот материал посвящён параметрам командной строки и ключам, которые можно передавать скриптам, работе с данными, которые вводит пользователь, и которые можно читать из файлов.

— здесь речь идёт о дескрипторах файлов и о работе с ними, о потоках ввода, вывода, ошибок, о перенаправлении вывода.

— этот материал посвящён сигналам Linux, их обработке в скриптах, запуску сценариев по расписанию.

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

— эта статья посвящена работе с потоковым текстовым редактором sed.

— данный материал посвящён программированию на языке обработки данных awk.

— тут можно почитать об использовании регулярных выражений в bash-скриптах.

Читайте также: