为何Bash中"${x:-''}"会被解析为''而非空字符串?
Bash中
${x:-''}为何解析为字面''而非空字符串? 你肯定也碰到过这个Bash里的小意外:当你使用"${x:-''}"这个参数展开写法时,结果居然是字面意义的'',而不是预期的空字符串!
先看下面的测试脚本:
#!/bin/bash x= y="${x:-''}" z=${x:-''} k="${x:-}" l=${x:-} echo "x = [$x]" echo "y = [$y]" echo "z = [$z]" echo "k = [$k]" echo "l = [$l]"
运行这段脚本后,输出结果是:
x = [] y = [''] z = [] k = [] l = []
Bash手册里对${parameter:-word}这个参数展开语法的描述是:
${parameter:-word}: 使用默认值。若parameter未设置或为空,则替换为word的展开结果;否则替换为parameter的值。
那问题出在哪呢?核心是Bash的引号解析和参数展开的顺序:
- 当你写
"${x:-''}"时,外层的双引号会让Bash先把整个${x:-''}当作参数展开的整体来处理。此时word部分是''——这两个单引号在参数展开阶段是作为普通字符存在的,因为外层双引号已经阻止了Bash对内部单引号进行“空字符串引用”的解析。所以当x为空时,替换后的结果就是''这两个字符,最终被双引号包裹后输出就是''。 - 而
z=${x:-''}没有外层双引号,Bash会先解析'',把它当作空字符串,所以参数展开后z就变成了空。 - 至于
"${x:-}",这里的word部分是空,所以当x为空时,直接替换为空字符串,自然输出就是空。
内容的提问来源于stack exchange,提问作者David Tonhofer
相关产品推荐
相关产品推荐

