Я знаю разницу между ${var:-word}
и ${var-word}
, но не вижу смысла использовать значение по умолчанию в это условие:
[ -z "${NVM_PROFILE-}" ]
Мне нравится set -u
.
$ sh -c '[ -z "NVM_PROFILE" ] && echo empty'
empty
$ sh -c 'set -u; [ -z "$NVM_PROFILE" ] && echo empty'
sh: NVM_PROFILE: unbound variable
$ sh -c 'set -u; [ -z "${NVM_PROFILE-}" ] && echo empty'
empty
Если опция nounset
включена с set -u
или set -o nounset
, [ -z "$NVM_PROFILE" ]
приведет к ошибке, если NVM_PROFILE
не установлен. Использование -
или :-
для явно расширения неустановленной переменной до пустой строки позволяет избежать этой ошибки.
Альтернативой использованию set -u
является явная проверка, установлена ли переменная. (Это работает в zsh
и bash
.)
[[ ! -v NVM_PROFILE || -z $NVM_PROFILE ]]
Для меня этот код не имеет смысла. Если тест проходит успешно, он продолжается и в любом случае использует (потенциально неустановленный)
${NVM_PROFILE}
. Если тест не удался, он по-прежнему использует${NVM_PROFILE-}
в ветвиelse
, хотя в этой точке должен быть установлен$NVM_PROFILE
.