Zsh 相当于什么: ${VAR:=value}

Jos*_*ero 0 shell zsh shell-script

在传统的 Bourne Shell (sh) 中,如果想确保在脚本中的某个点设置了一个变量并且至少它具有某个特定的默认值,则可以使用以下构造:

: "${VAR:=defaultValue}"
Run Code Online (Sandbox Code Playgroud)

Zsh 脚本的等价物是什么?

谢谢。

编辑:我的意思是,如果有 Zsh 特定的方法可以做到这一点。而不是仅仅执行真正的命令 (:)。

Edit2:正确引用参数扩展。请参阅 Stéphane Chazelas 的回答。

Sté*_*las 7

实际上,

: ${VAR:=defaultValue}
Run Code Online (Sandbox Code Playgroud)

是正确的zsh(前提是您没有启用该globsubst选项),但在其他 shell 中不正确。在其他类似 Bourne 的 shell 中,除非您启用noglob选项,如忘记在 bash/POSIX shells 中引用变量的安全隐患中所见,否则这将构成拒绝服务漏洞。

在那些中,你需要

: "${VAR:=defaultValue}"
Run Code Online (Sandbox Code Playgroud)

zsh 确实支持那些 Bourne 运算符,甚至以同样的方式引入了一些自己的运算符:

  • ${VAR::=value}无条件分配value给变量(并扩展到结果)。这很有用,zsh因为它可以与其他参数扩展运算符或标志结合使用。
  • ${:-value}(即VAR省略)扩展为value. 与其他运算符结合使用时再次有用。

这里的另一种选择是:

VAR=${VAR:-defaultValue}
Run Code Online (Sandbox Code Playgroud)

这在 zsh 和所有其他类似 Bourne 的 shell 中都可以,并且可以更清楚地传达含义。