Todas essas formas de expansão de parâmetros são alternativas:
-
${var:-val}é substituído porvalsevarnão estiver definido ou nulo,${var}caso contrário (entãovalé um "valor padrão"); -
${var:=val}primeiro atribuivalavarsevarnão estiver definido ou nulo e, em seguida, (em todos os casos) é substituído por${var}; -
${var:+val}é substituído por nada sevarnão estiver definido ou nulo,valcaso contrário.
Omitir o : elimina a parte "ou nula" de todas essas definições.
Tudo isso está descrito na bash(1) manpage .
Alguns exemplos podem ajudar:
unset a
echo "${a:-default}"
produz default , assim como echo "${a-default}" .
a=
echo "${a:-default}"
novamente produz default , mas echo "${a-default}" produz uma linha em branco.
a=test
echo "${a:-default}"
produz test , assim como echo "${a-default}" .
unset a
echo "${a:=default}"
produz default e a é agora default (conforme confirmado por echo "${a}" ).
A forma + pode parecer estranha, mas é útil ao construir variáveis em várias etapas:
PATH="${PATH}${PATH:+:}/blah/bin"
adicionará : antes de /blah/bin apenas se PATH não estiver vazio, o que evita ter um caminho começando com : .