Как использовать коды завершения в Bash-скриптах

В вычислениях , притон является последовательность символов , состоящая из символов знака числа и восклицательный знак ( #! ) В начале сценария . Это также называется sha-bang , [1] [2] hashbang , [3] [4] pound-bang , [5] [6] или hash-pling . [7]

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

Shell expr item1 оператор item2

1 expr item1 оператор item2
Как использовать коды завершения в Bash-скриптах

Давайте рассмотрим простой пример:

expr_

Shell #!/bin/bash # Базовая арифметика с использованием expr expr 5 + 4 expr «5 + 4» expr 5+4 expr 5 \* $1 expr 11 % 2 a=$( expr 10 — 3 ) echo $a # 7

123456789101112131415 #!/bin/bash# Базовая арифметика с использованием expr expr 5 + 4 expr «5 + 4» expr 5+4 expr 5 \* $1 expr 11 % 2 a=$( expr 10 3 )echo $a # 7

Давайте разберем это:

Как использовать коды завершения в Bash-скриптах
  • Строка 4 — это основной формат. Обратите внимание, что между элементами и пробелами нет пробелов.
  • Строка 6 — Если мы помещаем кавычки вокруг выражения, выражение не будет оцениваться, а печататься.
  • Строка 8 — Если мы не помещаем пробелы между элементами выражения, выражение не будет оцениваться, а печататься.
  • Строка 10 — Некоторые символы имеют особое значение для Bash, поэтому мы должны избегать их (поставить обратную косую черту перед), чтобы удалить их особое значение.
  • Строка 12 — Здесь мы покажем модуль оператора . Модуль — это остаток, когда первый элемент делится на второй элемент.
  • Строка 14 — На этот раз мы используем expr в подстановке команд, чтобы сохранить результат в переменной a.

Что такое коды завершения

В Linux и других Unix-подобных операционных системах программы во время завершения могут передавать значение родительскому процессу. Это значение называется кодом завершения или состоянием завершения. В POSIX по соглашению действует стандарт: программа передаёт 0 при успешном исполнении и 1 или большее число при неудачном исполнении.

Почему это важно? Если смотреть на коды завершения в контексте скриптов для командной строки, ответ очевиден. Любой полезный Bash-скрипт неизбежно будет использоваться в других скриптах или его обернут в однострочник Bash. Это особенно актуально при использовании инструментов автоматизации типа SaltStack или инструментов мониторинга типа Nagios. Эти программы исполняют скрипт и проверяют статус завершения, чтобы определить, было ли исполнение успешным.

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

Основы регулярных выражений

В общем виде синтаксис команды ‘grep’ выглядит следующим образом:

$ grep поисковый_запрос_regex расположение_файла

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

. будет соответствовать любому символу;
[ ] будет соответствовать диапазону символов;
[^ ] будет соответствовать всем символам, кроме указанных в фигурных скобках;
* будет соответствовать любому количеству символов, предшествующих звездочке, в том числе нулю;
+ будет соответствовать одному или нескольким из стоящих перед ним выражений;
? будет соответствовать нулю или одному из стоящих перед ним выражений;
{n} будет соответствовать ‘n’ повторениям предшествующих выражений;
{n,} будет соответствовать не менее ‘n’ повторениям предшествующих выражений;
{n m} будет соответствовать не менее ‘n’ и не более ‘m’ повторениям предшествующих выражений;
{,m} будет соответствовать не более или равному ‘m’ повторениям предшествующих выражений;
является escape-символом (символом экранирования), используемым, когда нужно включить один из метасимволов.

Первая строка в любой программе BASH

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

#!/bin/bash

Первый символ #, второй символ — !. Сразу за ними (без каких-либо пробелов) путь до интерпретатора: /bin/bash. И сразу после него перенос строки. Снова никаких пробелов.

Это всё важно. Иначе могут возникать ошибки, которые при первом взгляде не выявить: пробельные символы не видны, а кто может догадаться о том, что кто-то по доброте душевной решил не экономить и наставить лишних символов там, где не надо? 😉

Сочетание #! называется Shebang. В Линукс, если файл начинается с этих символов, это даёт команду операционной системе проследовать по идущему за ним пути по которому должна находиться программа или интерпретатор для запуска сценария, следующего за этой строкой.

Редактирование строки

Сочетание Действие
Alt+?, Tab+Tab Автодополнение команды или имени файла
Ctrl+u Удалить все символы от курсора до начала командной строки
Ctrl+k Удалить все символы от курсора до конца командной строки
Ctrl+w Удалить символы от курсора до пробела слева
Alt+Backspace Удалить символы от курсора до начала слова
Alt+d, Esc+d Удалить от курсора до конца слова
Ctrl+y Вставить символ, слово или текст, которые были удалены при помощи сочетаний клавиш, приведенных выше
Alt+y Пробежаться по буферу удалённых слов и вставить интересующий. Работает после нажатия Ctrl+y
Ctrl+h Удалить перед курсором один символ
Ctrl+d Удалить под курсором один символ
Alt+\ Удалить любое количество пробелов вокруг курсора
Ctrl+_ Откатить редактирование
Alt+r, Esc+r Отменить все изменения содержимого строки
Alt+c Превращает под курсором букву в заглавную и переводит курсор в конец слова
Alt+u Переводит все буквы от курсора и до конца слова в заглавные
Alt+l Переводит все буквы от курсора и до конца слова в нижний регистр
Alt+t Замена текущего слова под курсором на предыдущeе слово
Ctrl+t Замена символа перед курсором на предыдущий символ

Пример BASH Скрипта с Оператором CASE

#!/bin/bash printf ‘Какой Linux дистрибутив Вы знаете? ‘ read DISTR case $DISTR in ubuntu) echo «Я тоже знаю Ubuntu! Эта система основана на Debian.» ;; centos|rhel) echo «Эй! Это мой любимый серверный дистрибутив!» ;; windows) echo «Очень смешно…» ;; *) echo «Хмм, кажется я никогда не использовал этот дистрибутив.» ;; esac

Примеры работы скрипта:

$ ./ Какой Linux дистрибутив Вы знаете? centos Эй! Это моя любимая серверная операционная система! $ ./ Какой Linux дистрибутив Вы знаете? rhel Эй! Это моя любимая серверная операционная система! $ ./ Какой Linux дистрибутив Вы знаете? ubuntu Я тоже знаю ubuntu! Это операционная система, основанная на Debian. $ ./ Какой Linux дистрибутив Вы знаете? pfff Хмм, кажется я никогда не использовал этот дистрибутив.

Упрощаем сложные команды

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

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

alias top10files=”find . -type f -exec ls -sh {} \; | sort -n -r | head -10”

Если вы частенько подключаетесь к серверу с IP-адресом 1.2.3.4 по SSH, висящем на порту 22, от имени пользователя vasya, вам может оказаться полезным подобный псевдоним:

alias my_server=»ssh [email protected] -p 22″

Также вы можете создавать псевдонимы для ваших bash-сценариев, например:

alias clc=»bash /home/vasya/bin/»

Понимание case

Последний из важных итерационных циклов — это case*. Оператор case используется для оценки ряда ожидаемых значений. В частности, инструкции case важны в сценариях запуска Linux, которые в предыдущих версиях использовались для запуска служб.

* — цикл ли?

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

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

Листинг 9

case «$1» in start) start;; stop) rm -f $lockfile stop;; restart) restart;; reload) reload;; status) status ;; *) echo «Usage: $0 (start|stop|restart|reload|status)» ;; esac

case имеет несколько особенностей. Сначала идет строка — case последовательность in. Затем следует список всех возможных значений, которые необходимо оценить. Каждый элемент закрывается скобкой ).

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

Также обратите внимание, что *) относится ко всем другим параметрам, не указанным ранее. Это «всеохватывающий» оператор.

Цикл итераций case завершается оператором esac.

Обратите внимание, что последовательности в case выполняются по порядку. Когда будет выполнено первое совпадение, оператор case не будет ничего оценивать.

В рамках оценки могут использоваться шаблоны, подобные шаблону. Это показано в *) последовательности, которая соответствует всему. Но вы также можете использовать последовательности, такие как start|Start|START), чтобы соответствовать использованию другого case.

; — разделитель команд оболочки

В командной строке Вы можете вводить столько команд, сколько Вам нужно, если Вы разделяете каждую из них точкой с запятой (;). Мы сделаем это в следующем примере:

ls> ; wc -l ; rm

; - разделитель команд оболочки

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

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

cd ./doesntexist && cp ~ / Documents / reports / *.

; - разделитель команд оболочки