${name-word} と ${name:-word} は両方変数 $name にデフォルト値を設定するのに使います。 $name が未定義の場合、両方とも word を返します。
% echo ${null-foo} # $null は未定義だとする
foo
% echo ${null:-foo}
foo
違いは $name が空文字列の場合 ${name:-word} が word を返す一方 ${name-word} が空文字を返すことです。
% empty=''
% echo ${empty-foo}
% echo ${empty:-foo}
foo
似たものに ${name+word} と ${name:+word} があります。こちらは変数 $name に値がある場合に、その値を上書きするものです。
% hoge=hoge
% echo ${hoge+foo}
foo
% echo ${hoge:+foo}
foo
違いは $name が空文字列だった場合の挙動です。
% empty=''
% echo ${empty+foo}
foo
% echo ${empty:+foo}
$name が未定義の場合は、両方空になります。
% echo ${null+foo}
% echo ${null:+foo}
参考
- zshexpn(1) PARAMETER EXPANSION