Filip Roséen наткнулся на трюк, который меняет взгляд на shell-скрипты. Всё дело в : — встроенной команде null-command, которая не делает ничего, но вычисляет аргументы и отбрасывает результат. Оказалось, с её помощью можно выбросить привычный четырёхстрочный if для проверки обязательных аргументов и заменить его одной строкой: : "${1:?missing argument, aborting.}". Работает та же логика, только короче. Если переменная $1 пуста или не задана, parameter expansion с оператором :? печатает диагностику в stderr и завершает скрипт с ненулевым статусом. Если значение есть, выражение ведёт себя как $1. Префикс : здесь критичен: без него bash или zsh попытаются выполнить строку, полученную после подстановки, как команду, и вы получите «command not found». С null-command результат просто отбрасывается, а сам трюк срабатывает чисто.
Дальше — больше. : можно использовать для присвоения значений по умолчанию без лишних телодвижений: : "${DATA_DIR:=/var/data}" и : "${RETRIES:=3}". Очистить файл (или несколько) тоже легко: : > error.log или : > error.log > access.log. Проверка, существует ли файл, превращается в ( : < dataset.json ) && echo YES, а дозапись проверяется через ( : >> result.json ) && echo YES. Даже trap : INT спокойно глушит сигнал INT, ничего не делая. В условных конструкциях : заполняет пустую then-ветку, чтобы не писать заглушку вроде true.
Сама команда : родом из Thompson shell аж 1971 года, где служила одновременно меткой и первым в Unix маркером комментариев. А теперь она ещё и спасает от опечаток: : "${DATA_DIR:=/var/data}" требует ввести имя переменной лишь один раз, в отличие от DATA_DIR="${DATA_DIR:-/var/data}", где легко промахнуться в двух местах.
Если захочется магии, Filip Roséen приводит безопасный для выполнения пример: set : : : : : : : : : : : : : : : : : : : : и while : colons are more than "${1:?magic}" ; do echo "$*" && shift; done. Так что пара null-command и parameter expansion — определённо то, во что стоит вникнуть, пока не остыл кофе, и навсегда сократить себе писанину в скриптах.