Значение по умолчанию и проверка на пустоту
Это полезно, когда переменная может быть не задана или пустая. Вместо if часто хватает одной конструкции.
echo "${NAME:-guest}" # если NAME пустая или не задана → guest
echo "${NAME:=guest}" # то же самое, но еще и присвоит NAME=guest
echo "${NAME:?NAME required}" # если пустая/не задана → ошибка
echo "${NAME:+set}" # если NAME задана и не пустая → set
Короткая логика такая:
:- взять запасное значение
:= присвоить запасное значение
:? упасть с ошибкой
:+ вернуть другое значение, если переменная есть
Обрезка, замена и работа со строкой
Через expansion можно убрать префикс, суффикс или заменить кусок строки без sed и cut. Для shell-скриптов это очень удобно.
FILE="/opt/app/logs/error.log"
echo "${FILE#*/}" # opt/app/logs/error.log
echo "${FILE##*/}" # error.log
echo "${FILE%/*}" # /opt/app/logs
echo "${FILE%%/*}" # пусто, т.к. уберет все после первого /
echo "${FILE/logs/tmp}" # /opt/app/tmp/error.log
echo "${FILE//o/O}" # /Opt/app/lOgs/errOr.lOg
Запомнить можно так:
# и % = убрать кусок
## и %% = убрать по максимуму
/old/new = заменить первое совпадение
//old/new = заменить все
Длина, подстрока и индексы
Когда нужно быстро достать часть строки или длину, Bash уже умеет это сам.
STR="community-back-dev"
echo "${#STR}" # длина строки
echo "${STR:0:9}" # community
echo "${STR:10}" # back-dev
Для массивов тоже работает:
ARR=(api worker nginx)
echo "${ARR[0]}" # api
echo "${ARR[@]}" # все элементы
echo "${#ARR[@]}" # количество элементов
Вывод
Если в bash-скрипте у тебя появились cut, awk и sed ради одной мелочи, сначала проверь, нельзя ли решить это через parameter expansion. Часто это короче, быстрее и читается лучше.
LinuxCamp | #utils
