🐚 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.