TGViewer
LinuxSkill - Сводки с прода и Шпаргалки LinuxSkill - Сводки с прода и Шпаргалки @linuxskill · 10.7K subscribers
Post #1189 2.02K
🔧 Хватит писать как джун. 15 хардкорных идиом Bash для профи

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

Жёсткая защита и отладка


# 1. Неофициальный строгий режим bash.
# Падение при первой ошибке (-e), при обращении к необъявленной переменной (-u), и ошибка внутри конвейера не проглатывается (pipefail).
set -euo pipefail

# 2. Массив PIPESTATUS.
# В конвейере обычный $? покажет статус только ПОСЛЕДНЕЙ команды.
# PIPESTATUS хранит коды всех команд — ОБРАЩАЙСЯ ПО ИНДЕКСУ: ${PIPESTATUS[0]}, [1]...
cat /etc/passwd | grep -q root
echo "Статус cat: ${PIPESTATUS[0]}, статус grep: ${PIPESTATUS[1]}"

# 3. Безопасная очистка через trap.
# Временные файлы удалятся при любом выходе, включая Ctrl+C.
TMP_FILE=$(mktemp)
trap 'rm -f "$TMP_FILE"' EXIT


Подстановки переменных (без sed и awk)


# 4. Значение по умолчанию, если TARGET не задана или пуста.
cd "${TARGET:-/tmp}"

# 5. Глобальная замена подстрок в памяти (все вхождения).
LOG="system error, network error"
echo "${LOG//error/warning}"

# 6. Косвенные ссылки: читаем переменную, имя которой лежит в другой переменной.
REAL_VAR="SecretData"
POINTER="REAL_VAR"
echo "${!POINTER}"

# 7. Обрезка префикса/суффикса (замена basename и dirname).
FILEPATH="/var/log/syslog.tar.gz"
echo "${FILEPATH##*/}" # всё до последнего слеша срезано: syslog.tar.gz
echo "${FILEPATH%/*}" # всё после последнего слеша срезано: /var/log


Логика и структуры


# 8. Регулярки прямо в условии (только в [[ ... ]], регулярку справа НЕ кавычим).
if [[ $1 =~ ^[0-9]+$ ]]; then
echo "Аргумент состоит только из цифр"
fi

# 9. Группировка команд в ТЕКУЩЕМ процессе через { ... } (переменные сохраняются).
[[ -d /tmp/app ]] || { echo "Каталог не найден"; exit 1; }

# 10. Встроенная арифметика вместо мёртвого expr.
# ОСТОРОЖНО: под 'set -e' выражение (( x++ )) возвращает код 1, когда старое значение 0, и убивает скрипт. Используй префиксную форму ++COUNT или добавляй '|| true'.
COUNT=5
(( ++COUNT ))
(( REMAINING = 100 - COUNT ))


Потоки и дескрипторы


# 11. Подстановка процессов: вывод команд туда, где ждут ИМЕНА файлов.
diff -u <(ls -l /dir1) <(ls -l /dir2)

# 12. Here String: строка на stdin без лишнего процесса echo.
grep "critical" <<< "$LOG_DATA"

# 13. Правильное построчное чтение.
# -r запрещает трактовать бэкслеши, пустой IFS= сохраняет ведущие пробелы.
while IFS= read -r line; do
echo "Прочитана строка: $line"
done < config.txt

# 14. Парсинг строки с локальной подменой IFS (только для этой команды read).
USER_INFO="root:x:0:0:root:/root:/bin/bash"
IFS=":" read -r user pass uid gid desc home shell <<< "$USER_INFO"

# 15. Совместное перенаправление stdout и stderr одним оператором.
/opt/scripts/backup.sh &> /var/log/backup.log


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

❗️❗️❗️ Нравится формат? Ставь 👍

👉 Рубрика: #шпаргалка@LinuxSkill
#Linux #Bash #DevOps #Scripting #SysAdmin
  • 👍 9
  • 🔥 2
More from @linuxskill
  1. Oct 2, 2026📊 Диск тормозит, а iostat показывает норму? Ищем хвост задержек Приложение подвисает на з…
  2. Sep 30, 2026💀 CPU под 100%, а в top пусто? Ловим невидимые процессы через eBPF Сервер греется, в шапк…
  3. Sep 28, 2026🔥 Знаешь только ip a? 10 неочевидных команд ip для Linux Большинство админов знают про ip…
  4. Sep 25, 2026Разобрать строку штатным <regex.h> и не получить молчаливое «нет совпадения». Проверял на…
  5. Sep 23, 2026Закрыть периметр правилами iptables и не остаться при этом за дверью вместе с атакующим. П…
  6. Sep 21, 2026Добавить пользователя в группу и не выкинуть его при этом из sudo Добавить во вторичную гр…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →