Bash 条件中不带冒号(默认值为空字符串)的参数扩展

Bash 条件中不带冒号(默认值为空字符串)的参数扩展,bash,zsh,parameter-expansion,Bash,Zsh,Parameter Expansion,我知道${var:-word}和${var-word}之间的区别,但我看不出在以下情况下使用默认值的目的: 为什么这里需要一个空的默认值 它是否与其他shell(zsh)的兼容性有关 我喜欢set-u $ sh -c '[ -z "NVM_PROFILE" ] && echo empty' empty $ sh -c 'set -u; [ -z "$NVM_PROFILE" ] && echo empty' sh: NVM_PROFILE: unbound va

我知道
${var:-word}
${var-word}
之间的区别,但我看不出在以下情况下使用默认值的目的:

  • 为什么这里需要一个空的默认值
  • 它是否与其他shell(zsh)的兼容性有关

    • 我喜欢
      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
      

      我喜欢
      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
      

      如果使用
      set-u
      set-o nounset
      启用
      nounset
      选项,
      [-z“$NVM\u PROFILE”]
      如果未设置
      NVM\u PROFILE
      ,将导致错误。使用
      -
      :-
      将未设置变量显式扩展为空字符串可以避免该错误

      使用
      set-u
      的替代方法是显式检查变量是否已设置。(这适用于
      zsh
      bash


      如果使用
      set-u
      set-o nounset
      启用
      nounset
      选项,
      [-z“$NVM\u PROFILE”]
      如果未设置
      NVM\u PROFILE
      ,将导致错误。使用
      -
      :-
      将未设置变量显式扩展为空字符串可以避免该错误

      使用
      set-u
      的替代方法是显式检查变量是否已设置。(这适用于
      zsh
      bash


      那个代码对我来说毫无意义。如果测试成功,它将继续使用(可能未设置的)
      ${NVM_PROFILE}
      。如果测试没有成功,它仍然在
      else
      分支中使用
      ${NVM\u PROFILE-}
      ,即使此时必须设置
      $NVM\u PROFILE
      。该代码对我来说毫无意义。如果测试成功,它将继续使用(可能未设置的)
      ${NVM_PROFILE}
      。如果测试没有成功,它仍然在
      else
      分支中使用
      ${NVM\u PROFILE-}
      ,即使此时必须设置
      $NVM\u PROFILE
      [[ ! -v NVM_PROFILE || -z $NVM_PROFILE ]]