花括号中的变量扩展

use*_*290 18 bash

这是代码

a=''
b=john
c=${a-$b}
echo $c
Run Code Online (Sandbox Code Playgroud)

并且输出是空行

对于第一个变量未初始化的类似代码

b1=doe
c1=${a1-$b1}
echo $c1
Run Code Online (Sandbox Code Playgroud)

输出是

doe
Run Code Online (Sandbox Code Playgroud)

我不明白bash如何处理扩展导致不同结果的变量.

Jon*_*ler 44

${var-value}符号有两种变体,一种没有冒号,如图所示,另一种带冒号:${var:-value}.

第一个版本,没有冒号,表示'if $var设置为任何值(包括空字符串),使用它; 否则,value改为使用'.

带冒号的第二个版本意味着'if $var被设置为除空字符串之外的任何值,使用它; 否则,value改为使用'.

这种模式也适用于其他变量替换,特别是:

  • ${var:=value}
    • if $var设置为任何非空字符串,保持不变; 否则,设置$varvalue.
  • ${var=value}
    • if $var设置为任何值(包括空字符串),保持不变; 否则,设置$varvalue.
  • ${var:?message}
    • 如果$var设置为任何非空字符串,则不执行任何操作; 否则,使用给定的消息"投诉"(如果message本身为空,则提供默认消息).
  • ${var?message}
    • 如果$var设置为任何值(包括空字符串),则不执行任何操作; 否则,使用给定的消息抱怨'.

这些符号都适用于任何POSIX兼容的shell(Bourne,Korn,Bash等).您可以bash在线找到该版本的手册- 在Shell参数扩展部分.Bash还有许多非标准符号,其中许多非常有用,但不一定与其他shell共享.

  • `if test "${var+set}" = set; 中所示的 `+` 是什么意思?然后`在[如何检查环境变量?](http://gnu-autoconf.7623.n7.nabble.com/How-can-I-check-an-environment-variable-td13092.html) (2认同)