🐚 Bash

Переменные, условия, циклы, функции, потоки, конвейеры и полезные приёмы скриптов.

Шпаргалки · Администрирование · #bash #shell #linux #terminal

Основы

#!/usr/bin/env bash
set -euo pipefail          # прервать при ошибке, неопределённой переменной, сбое в конвейере

name="Аня"; echo "Привет, $name"; echo "Сумма: $((2 + 3))"
today=$(date +%F)          # результат команды в переменную

Запуск: chmod +x run.sh && ./run.sh, bash run.sh.

Аргументы и специальные переменные

Переменная Значение
$0 имя скрипта
$1 $2 … аргументы
$# количество аргументов
$@ все аргументы (по отдельности, в кавычках)
$? код возврата последней команды (0 успех)
$$ PID скрипта
${var:-default} значение по умолчанию

Условия

if [[ -f "$file" && -r "$file" ]]; then echo "есть"
elif [[ "$n" -gt 5 ]]; then echo "много"
else echo "нет"; fi

case "$x" in start) run ;; stop|halt) stop ;; *) echo "?" ;; esac

Проверки файлов: -f файл, -d папка, -e существует, -s не пуст, -x исполняемый. Числа: -eq -ne -lt -gt -le -ge. Строки: == != -z -n.

Циклы

for i in 1 2 3; do echo "$i"; done
for f in *.log; do gzip "$f"; done
for ((i=0; i<3; i++)); do echo "$i"; done
while read -r line; do echo "$line"; done < file.txt
until ping -c1 host &>/dev/null; do sleep 2; done

Функции и массивы

greet() { local who="$1"; echo "Привет, $who"; }
arr=(a b c); echo "${arr[0]} ${#arr[@]} ${arr[@]}"
declare -A map=([k]=v); echo "${map[k]}"

Потоки и конвейеры

Запись Смысл
cmd > f / >> f stdout в файл (перезапись / добавление)
cmd 2> f stderr в файл
cmd &> f или > f 2>&1 stdout и stderr
cmd < f ввод из файла
a | b вывод a на вход b
cmd > /dev/null отбросить вывод
a && b / a || b выполнить b при успехе / ошибке a

Полезные конструкции

cmd1 | tee out.log | grep ERROR        # писать и фильтровать
find . -name '*.js' -print0 | xargs -0 wc -l
diff <(sort a) <(sort b)               # подстановка процесса
trap 'rm -f "$tmp"' EXIT               # уборка при выходе

Горячие клавиши терминала

Ctrl+C прервать, Ctrl+D конец ввода, Ctrl+R поиск по истории, Ctrl+A / E начало / конец строки, Ctrl+L очистить, !! предыдущая команда, Tab дополнение.

Совет: Заключайте переменные в кавычки ("$var"), чтобы пробелы в значениях не ломали команды. Проверяйте скрипты shellcheck.