23

这是代码

a=''
b=john
c=${a-$b}
echo $c

并且输出是空行

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

b1=doe
c1=${a1-$b1}
echo $c1

输出是

doe

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

4

1 回答 1

53

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

第一个版本,没有冒号,意思是'如果$var设置为任何值(包括空字符串),使用它;否则,请value改用'。

第二个版本,带有冒号,表示'如果$var设置为除空字符串之外的任何值,则使用它;否则,请value改用'。

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

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

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

于 2013-01-04T06:59:55.577 回答