:+Jest formą ekspansji parametrów :
$ {parametr: + [słowo]} : Użyj wartości alternatywnej.
Jeśli parametr jest nieustawiony lub ma wartość NULL, wartość NULL należy zastąpić; w przeciwnym razie rozwinięcie słowa (lub pusty ciąg znaków, jeśli słowo zostanie pominięte) zostanie zastąpione.
Innymi słowy, jeśli zmienna $varjest zdefiniowana, echo ${var:+foo}wydrukuje, fooa jeśli nie, wydrukuje pusty ciąg.
Drugi :to nic specjalnego. Jest to znak używany jako separator na liście katalogów w $PATH. Jest więc PATH="/usr/local/bin:/usr/bin${PATH:+:${PATH}}"skrótowym sposobem pisania:
if [ -z "$PATH" ]; then
PATH=/usr/local/bin:/usr/bin
else
PATH=/usr/local/bin:/usr/bin:$PATH
fi
To tylko sprytna sztuczka, aby uniknąć dodawania dodatkowych, :gdy $PATHnie jest ustawiona. Na przykład:
$ PATH="/usr/bin"
$ PATH="/new/dir:$PATH" ## Add a directory
$ echo "$PATH"
/new/dir:/usr/bin
Ale jeśli PATHjest rozbrojony:
$ unset PATH
$ PATH="/new/dir:$PATH"
$ echo "$PATH"
/new/dir:
:Sam dodaje aktualny katalog $PATH. Używanie PATH="/new/dir${PATH:+:$PATH}"pozwala tego uniknąć. Więc na pewno możesz użyć, PATH="${PATH:+${PATH}:}/usr/local/bin:/usr/bin"jeśli chcesz, lub możesz użyć, PATH="$PATH:/usr/local/bin:/usr/bin"jeśli wolisz. Jedyna różnica polega na tym, że ten pierwszy może dodać dodatkowy :, a tym samym dodać bieżący katalog do twojego $PATH.