TGViewer
LinuxSkill - Сводки с прода и Шпаргалки LinuxSkill - Сводки с прода и Шпаргалки @linuxskill · 10.7K subscribers
Post #1193 1.59K
☠️ Твой скрипт не переживёт пробел в имени файла. 15 сниппетов для сеньоров

Замечал, как рабочий скрипт внезапно затирает данные из-за пустой переменной или ломается от кривого переноса строки? Чтобы не краснеть за код перед коллегами, перестань использовать устаревшие конструкции. Держи 15 жёстких приёмов для неубиваемых скриптов.

Защита от фатальных сбоев

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

# 2. Безопасная очистка мусора. Сработает даже при Ctrl+C (SIGINT).
TMP_DIR=$(mktemp -d)
trap 'rm -rf "$TMP_DIR"' EXIT

# 3. Статусы в конвейере. Обычный $? покажет только последнюю команду.
# PIPESTATUS хранит массив — обращайся ПО ИНДЕКСУ: [0], [1]...
cat /etc/passwd | grep -q missing_user
echo "Статус cat: ${PIPESTATUS[0]}, статус grep: ${PIPESTATUS[1]}"


Работа с переменными без sed и awk

# 4. Значение по умолчанию. Защищает от rm по пустому пути.
# ВАЖНО: при set -u скрипт и так упадёт на пустой TARGET — двойная защита.
rm -rf "${TARGET:-/tmp/fallback}/"*

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

# 6. Косвенная адресация: чтение переменной по имени из другой переменной.
REAL_VAR="SecretKey"
POINTER="REAL_VAR"
echo "${!POINTER}"

# 7. Нативная замена basename и dirname (без вызова внешних утилит).
FILE="/var/log/syslog.gz"
echo "${FILE##*/}" # syslog.gz (срезано всё до последнего слеша)
echo "${FILE%/*}" # /var/log (срезано всё после последнего слеша)


Логика без костылей

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

# 9. Группа команд в текущем процессе (без subshell) — переменные сохраняются.
[[ -d /app ]] || { echo "Директории нет"; exit 1; }

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


Работа с файлами и потоками

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

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

# 13. Эталонное построчное чтение: -r не трогает бэкслеши, IFS= хранит пробелы.
while IFS= read -r line; do
echo "Строка: $line"
done < config.txt

# 14. Разбивка строки на переменные с локальной подменой разделителя.
USER_DATA="admin:x:1000"
IFS=":" read -r user pass uid <<< "$USER_DATA"

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


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

👉 Рубрика: #шпаргалка@LinuxSkill
#Linux #Bash #DevOps #Scripting #SysAdmin
  • 👍 10
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 →