:+Є формою розширення параметра :
$ {параметр: + [слово]} : Використовуйте альтернативне значення.
Якщо параметр не встановлений або недійсний, нуль заміняється; в іншому випадку розширення слова (або порожній рядок, якщо слово пропущено) заміняється.
Іншими словами, якщо змінна $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:
A :сам додає поточний каталог до $PATH. Використання PATH="/new/dir${PATH:+:$PATH}"уникає цього. Отже, ви можете використовувати, PATH="${PATH:+${PATH}:}/usr/local/bin:/usr/bin"якщо хочете, або ви можете використовувати, PATH="$PATH:/usr/local/bin:/usr/bin"якщо хочете. Єдина відмінність полягає в тому, що перший може додати додатковий :, тим самим додавши поточний каталог у свій $PATH.