Замечал, как рабочий скрипт внезапно затирает данные из-за пустой переменной или ломается от кривого переноса строки? Чтобы не краснеть за код перед коллегами, перестань использовать устаревшие конструкции. Держи 15 жёстких приёмов для неубиваемых скриптов.
Защита от фатальных сбоев
# 1. Неофициальный строгий режим. Падение при первой ошибке,
# обращении к пустой переменной и ошибке внутри конвейера.
Код: Выделить всё
set -euo pipefailКод: Выделить всё
TMP_DIR=$(mktemp -d)
trap 'rm -rf "$TMP_DIR"' EXIT# 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}/"*Код: Выделить всё
LOG="error db, error net"
echo "${LOG//error/warning}"Код: Выделить всё
REAL_VAR="SecretKey"
POINTER="REAL_VAR"
echo "${!POINTER}"Код: Выделить всё
FILE="/var/log/syslog.gz"
echo "${FILE##*/}" # syslog.gz (срезано всё до последнего слеша)
echo "${FILE%/*}" # /var/log (срезано всё после последнего слеша)
# 8. Регулярки нативно (только в [[ ]], регулярку справа НЕ кавычим).
Код: Выделить всё
if [[ $1 =~ ^[0-9]+$ ]]; then
echo "Передано число"
fiКод: Выделить всё
[[ -d /app ]] || { echo "Директории нет"; exit 1; }# ОСТОРОЖНО: под set -e постфиксный (( COUNT++ )) возвращает код 1, когда старое
# значение было 0, и убивает скрипт. Используй префиксную форму
Код: Выделить всё
++COUNT.
COUNT=5
(( ++COUNT ))
(( REMAINING = 100 - COUNT ))Работа с файлами и потоками
# 11. Подстановка процессов: вывод команд туда, где ждут файлы.
Код: Выделить всё
diff -u <(ls -l /dir1) <(ls -l /dir2)Код: Выделить всё
grep "critical" <<< "$LOG_DATA"Код: Выделить всё
while IFS= read -r line; do
echo "Строка: $line"
done < config.txtКод: Выделить всё
USER_DATA="admin:x:1000"
IFS=":" read -r user pass uid <<< "$USER_DATA"
Код: Выделить всё
/opt/scripts/deploy.sh &> /var/log/deploy.log#Linux #Bash #DevOps #Scripting #SysAdmin