如何评估大括号内的变量

WLI*_*ION 7 shell scripting bash

我是 shell 脚本的新手,我遇到了这些表达式

${var:-val}${var-val}

${var:+val}${var+val}

${var:=val}${var=val}

那么它们是如何评估的,它们之间有什么区别

Ste*_*itt 6

这些都是具有替代方案的各种形式的参数扩展:

  • ${var:-val}valifvar未设置或 null替换,${var}否则(val“默认值”也是如此);
  • ${var:=val}首先分配valvarif varis unset 或 null,然后(在所有情况下)被替换为${var};
  • ${var:+val}被替换什么,如果var是设置或为空,val否则。

省略:掉所有这些定义的“或空”部分。

这在bash(1)联机帮助页POSIX 中都有描述。

一些例子可能会有所帮助:

unset a
echo "${a:-default}"
Run Code Online (Sandbox Code Playgroud)

产生default,就像echo "${a-default}".

a=
echo "${a:-default}"
Run Code Online (Sandbox Code Playgroud)

再次产生default,但echo "${a-default}"输出一个空行。

a=test
echo "${a:-default}"
Run Code Online (Sandbox Code Playgroud)

产生test,就像echo "${a-default}".

unset a
echo "${a:=default}"
Run Code Online (Sandbox Code Playgroud)

产生defaulta现在是default(由 确认echo "${a}")。

这种+形式可能看起来很奇怪,但在分几个步骤构造变量时它很有用:

PATH="${PATH}${PATH:+:}/blah/bin"
Run Code Online (Sandbox Code Playgroud)

仅在非空时才会添加:before ,从而避免路径以./blah/binPATH: