:+Является формой расширения параметра :
$ {параметр: + [слово]} : использовать альтернативное значение.
Если параметр не установлен или ноль, ноль должен быть заменен; в противном случае расширение слова (или пустая строка, если слово опущено) должно быть заменено.
Другими словами, если переменная $varопределена, echo ${var:+foo}она напечатает, fooа если нет, то напечатает пустую строку.
Второе :ничего особенного. Это символ, используемый в качестве разделителя в списке каталогов в $PATH. Итак, PATH="/usr/local/bin:/usr/bin${PATH:+:${PATH}}"это сокращенный способ написания:
if [ -z "$PATH" ]; then
PATH=/usr/local/bin:/usr/bin
else
PATH=/usr/local/bin:/usr/bin:$PATH
fi
Это просто умный трюк, чтобы избежать добавления лишнего, :когда $PATHон не установлен. Например:
$ PATH="/usr/bin"
$ PATH="/new/dir:$PATH" ## Add a directory
$ echo "$PATH"
/new/dir:/usr/bin
Но если PATHне установлено:
$ unset PATH
$ PATH="/new/dir:$PATH"
$ echo "$PATH"
/new/dir:
:Сам по себе добавляет текущий каталог в $PATH. Использование PATH="/new/dir${PATH:+:$PATH}"избегает этого. Так что вы можете использовать, PATH="${PATH:+${PATH}:}/usr/local/bin:/usr/bin"если хотите, или использовать, PATH="$PATH:/usr/local/bin:/usr/bin"если хотите. Единственная разница в том, что первый может добавить дополнительный :, тем самым добавив ваш текущий каталог в ваш $PATH.