Синтаксис Bash для начинающих. Интерпретатор Bash

Рейтинг: 5  / 5

Условные операторы

Двойные квадратные скобки [[ … ]] bash интерпретирует как один элемент с кодом возврата. Внутри разрешается использование операторов && и ||.

## Однострочная запись [[ -f /dir/file ]] || { echo «File not exists»; exit 1; } ## Вложенные условия if [ … ] && [ … ]; then … elif [[ … && … ]]; then … else … fi;

Пример проверки что переменная не пустая:

if [[ $some_var != » ]]; then echo ‘Переменная не пустая’ fi

Комбинированные условия с отрицанием:

if [ -f /path/ ] && [ ! -z «$status» ]; then echo «Файл и переменная существуют» else echo «Нет файла или переменной» fi

Оператор case:

case «$extension» in (html|htm) echo «Это HTML файл» ;; pdf) echo «Это PDF файл» ;; *) echo «Не известный тип файла: $extension» ;; esac

Условия сравнения

Смотрите доп. условия проверки файлов —

### Файлы ### -e Проверить что файл существует (-f, -d) -f Файл существует (!-f — не существует) -d Каталог существует -s Файл существует и не пустой -r Файл существует и доступен на чтение -w … на запись -x … на выполнение -h Символическая ссылка -b Файл существует и является блочным устройством -с Файл существует и является символьным устройством (character device) -p Файл существует и является потоковым устройством (pipe device) -S Файл существует и является сокетом ### Строки ### -z Пустая строка -n Не пустая строка == Равно (!= не равно) ### Числа ### -eq Равно -ne Не равно -lt Меньше -le Меньше или равно -gt Больше -ge Больше или равно

Установка дефолтного значения переменной

Не работает для массивов!

Установка значения по умолчанию для аргумента:

Читайте также:  Когда выйдет вторая бета-версия iOS 14 beta 2

SOME_VAR=${1:-‘default’} # Если первый аргумент ($1) пустой — присвоить строку SOME_VAR=${2:-$default} # Если аргумент $2 пустой — установить значение $default : ${my_var:=$default} # Если $my_var пустая — присвоить ей значение из $default

Установка дефолтного значения для существующей переменной:

TEST=’YES’ : ${TEST:=’some string’} echo $TEST # YES

Основные команды

Команда интерпретатора Bash man

Отображает руководства по командам. К примеру, последующая команда выдаст вам все данные о команде cat:

$ man cat

Команда интерпретатора Bash cat

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

Команда интерпретатора Bash echo

Осуществляет вывод своих аргументов по стандартному каналу вывода.

$ echo Hello World Hello World

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

Команда интерпретатора Bash head

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

$ head -50

Команда интерпретатора Bash tail

Работает аналогично head, однако читает строки с конца:

Основные команды

$ tail -50

Дополнительно есть возможность просматривания добавляемых к файлу строк в режиме реального времени, используя флаг -f:

$ tail -f

Команда интерпретатора Bash less

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

$ less $ ps aux | less

Кстати, о символе | мы расскажем ниже в блоке про команду интерпретатора Bash history.

Команды интерпретатора Bash true и false

Первая всегда возвращает ноль в качестве выходного статуса для индикации успеха, вторая, соответственно, не ноль в качестве выходного статуса для индикации неудачи.

$? — это переменная, содержащая выходной статус последней запущенной команды. Выходной статус — код возврата программы. В нашем случае 0 будет означать успешное выполнение программы, а любое значение, которое больше нуля, будет отражать факт возникновения ошибок в процессе выполнения. Кстати, именно по этой причине в интерпретаторе Bash истиной (true) считается 0, а ложью (false) — всё, что не ноль.

$ true $ echo $? $ false $ echo $? 1

Команда интерпретатора Bash grep

Служит для поиска переданной строки в указанном файле:

$ cat user:student password:123 user:teacher password:321 $ grep 'student` user:student password:123

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

Команда интерпретатора Bash sed

Потоковый редактор, который преобразует входные текстовые данные. Используется для замены выражений следующим образом: s/regexp/replacement/g. К примеру, в следующем коде произойдёт замена всех слов «Hello» на «Hi»:

Читайте также:  chmod — команда изменения прав файлов и папок в linux

$ cat Hello World $ sed 's/Hello/Hi/g' Hi World

Руководство по sed.

Команда интерпретатора Bash history

Выводит историю командной строки. Часто используется совместно с grep при поиске конкретной команды. В коде ниже будут найдены все команды, которые содержат строку g++:

$ history | grep g++ 155 g++ 159 g++

Кстати, здесь тоже можно увидеть символ | — это конвейер (pipe). С его помощью происходит перенаправление вывода одной команды на вход другой. Так, в вышеописанном примере вся история (в обычном режиме она выводится с помощью history непосредственно в вывод терминала), перенаправляется в grep в качестве входных данных. То есть мы не увидим вывод команды history, зато увидим вывод команды grep.

Команда интерпретатора Bash export

Устанавливает переменные окружения для их передачи дочерним процессам. Допустим, так мы можем передать переменную name, имеющую значение student:

$ export name=student

Команда интерпретатора Bash ps

Выводит данные о запущенных процессах.

Основные команды

$ ps PID TTY TIME CMD 35346 pts/2 00:00:00 bash

В результате выведутся 4 элемента: — PID (ID процесса), — TTY (тип терминала), — TIME (время работы процесса), — CMD (имя команды, запустившей процесс).

Команда интерпретатора Bash awk

Находит и меняет текст в файлах на основании заданного шаблона: awk ‘pattern {action}’

Команда интерпретатора Bash wget

Закачивает файлы из интернета, помещая их в текущий каталог.

$ wget -cs100

Команда интерпретатора Bash nc

Утилита для отладки сети. Вот руководство.

Команда интерпретатора Bash ping

Служит для тестирования сетевого подключения.

$ ping PING (74) 56(84) bytes of data. 64 bytes from (74): icmp_req=1 ttl=57 time=7.82 ms — ping statistics — 1 packets transmitted, 1 received, % packet loss, time 8ms rtt min/avg/max/mdev = 7.794/ ms

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

Статья написана специально для курса по Linux на основании материалов Bash-Cheatsheet.

Переменные и параметры скрипта

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

#!/bin/bash #указываем где у нас хранится bash-интерпретатор parametr1=$1 #присваиваем переменной parametr1 значение первого параметра скриптаscript_name=$0 #присваиваем переменной script_name значение имени скриптаecho "Вы запустили скрипт с именем $script_name и параметром $parametr1" # команда echo выводит определенную строку, обращение к переменным осуществляется через $имя_ `Вы запустили скрипт с именем $script_name и параметром $parametr1` # здесь мы видим другие кавычки, разница в том, что в одинарных кавычках не происходит подстановки 0 #Выход с кодом 0 (удачное завершение работы скрипта)

Читайте также:  FTP сервер: настройка, подключение и передача файлов

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

[email protected]:~$ ./ qwerty

Вы запустили скрипт с именем ./ и параметром qwertyВы запустили скрипт с именем $script_name и параметром $parametr1

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

$DIRSTACK — содержимое вершины стека каталогов$EDITOR — текстовый редактор по умолчанию$EUID — Эффективный UID. Если вы использовали программу su для выполнения команд от другого пользователя, то эта переменная содержит UID этого пользователя, в то время как…$UID — реальный идентификатор, который устанавливается только при логине.$FUNCNAME — имя текущей функции в скрипте.$GROUPS — массив групп к которым принадлежит текущий пользователь$HOME — домашний каталог пользователя$HOSTNAME — ваш hostname$HOSTTYPE — архитектура машины.$LC_CTYPE — внутренняя переменная, котороя определяет кодировку символов$OLDPWD — прежний рабочий каталог$OSTYPE — тип ОС$PATH — путь поиска программ$PPID — идентификатор родительского процесса$SECONDS — время работы скрипта(в сек.)$# — общее количество параметров переданных скрипту$* — все аргументы переданыне скрипту(выводятся в строку)[email protected] — тоже самое, что и предыдущий, но параметры выводятся в столбик$! — PID последнего запущенного в фоне процесса$$ — PID самого скрипта

Как узнать значение последнего параметра, передаваемого BASH-скрипту

И последний вопрос, который рассмотрим в этой статье, это как узнать значение последнего параметра, передаваемого BASH-скрипту сразу (без перебора, подсчёта и разбора). В этом вопросе нам выручит как раз переменная $#, указывающая порядковый номер последнего параметра. А зная номер параметра, можно сразу получить его значение в переменной ${!#}. На практике выглядит это так:

#!/bin/bash echo ‘Количество параметров на входе: ‘ $# if [ -n «$1» ] then echo -e ‘Последний параметр имеет значение: ‘ ${!#} ‘\n’ echo ‘Имя скрипта: ‘ $0 echo ‘1-й параметр: ‘ $1 echo ‘2-й параметр: ‘ $2 echo ‘3-й параметр: ‘ $3 echo ‘4-й параметр: ‘ $4 else echo ‘Нет данных на входе скрипта ‘ $0 fi

Результатом выполнения будет следующее:

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