Bash令人惊讶地评估“$ {x: - ''}”到(字面意思)''而不是空字符串

时间:2018-05-17 16:41:39

标签: bash

以下计划

#!/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]"

shellcheck说'没有发现问题')

产量

x = []
y = ['']
z = []
k = []
l = []

${parameter:-word}表示的参数扩展在 bash 的手册页中描述如下:

  

$ {parameter:-word}:使用默认值。如果参数未设置或   null,单词的扩展被替换。否则,值   参数被替换。

如何评估"${x:-''}"导致字符串''而不是空字符串?

2 个答案:

答案 0 :(得分:5)

y="${x:-''}"扩展以来,替换字中的字符也被视为双引号。结果类似于y=${x:"''"},但在后一种情况下,$x的内容未引用(另请参阅下面的注释)。

同样适用于在替换中使用glob字符(例如*)。

注意:正如@thatotherguy在评论中指出的那样,替换词必须具有平衡的引号(和大括号),即使引用了最外层的扩展。因此y="${x:-'}"即使y=${x:-"'"}无效,}也无效。那是因为......

  

...参数替换"的结束}是第一个man bash没有   通过反斜杠或带引号的字符串进行转义,而不是在   嵌入式算术扩展,命令替换或参数   扩展

(引自y="${x:-""}",但在Posix中可以找到非常相似的措辞)

此外,双引号内未引用双引号。因此,在ant setup-eclipse-project中,双引号中的所有都会被引号删除删除。

答案 1 :(得分:2)

来自here

  

用双引号括起字符(&#34;&#34;)应保留   双引号内所有字符的字面值,用   字符反引号<dollar-sign><backslash>

的例外情况

here

  

报价删除(请参阅报价删除)应始终执行。

最重要的是,here

  

原始单词中出现的引号字符(<backslash>,单引号和双引号)将被删除除非它们自己被引用。

您使用双引号引用''使其成为字面值。