花括号中的变量扩展

时间:2013-01-04 06:55:05

标签: bash

这是代码

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

输出为空行

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

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

输出

doe

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

1 个答案:

答案 0 :(得分:40)

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

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

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

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

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

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