变量扩展中默认值的元字符处理

变量扩展中默认值的元字符处理

当为变量扩展提供默认值时(例如${varname-default}),组成的字符将如何default解释?

天真地,我猜测变量替换(例如 $b)和类似引号字符的扩展', ",\会在这种情况下发生......但看起来类似引号字符的扩展并不总是发生。

例如,

> echo x${a-''}y
xy

> echo x"${a-''}"y 
x''y

我预计在这两种情况下,因为扩展变量如和 的xy构造工作正常。${a-$PATH}( BRACE='}'; echo ${a-$BRACE} )

然而GNU bash, version 4.4.19(1)-release......两者的最新版本mksh具有相同的行为,其中''字面上包含在第二个示例的输出中。

答案1

扩展${parameter:-[word]}有几个扩展:

男人狂欢:

在下面的每种情况下,单词可以进行波形符扩展、参数扩展、命令替换和算术扩展。

POSIX 规范:

单词应进行波形符扩展、参数扩展、命令替换和算术扩展。

两者报告相同,并且两者都这样做不包括“引用删除”。

引号被删除整个变量的扩展已经完成。然而,很难准确地展示这是如何完成的:

$ sh
$ unset b
$ set -x
+ set -x
$ echo 1 ${b-e}
+ echo 1 e
1 e
$ echo 2 ${b-"e"}
+ echo 2 e
2 e
$ echo 3 ${b-'e'}
+ echo 3 e
3 e
$ echo 4 "${b-e}"
+ echo 4 e
4 e
$ echo 5 "${b-"e"}"
+ echo 5 e
5 e
$ echo 6 "${b-'e'}"
+ echo 6 'e'
6 'e'
$ set +x
+ set +x

或者:

$ $ set -x; echo 1 x${b-e}y; echo 2 x${b-"e"}y; echo 3 x${b-'e'}y; echo 4 "x${b-e}y"; echo 5 "x${b-"e"}y"; echo 6 "x${b-'e'}y"; set +x
+ echo 1 xey
1 xey
+ echo 2 xey
2 xey
+ echo 3 xey
3 xey
+ echo 4 xey
4 xey
+ echo 5 xey
5 xey
+ echo 6 x'e'y
6 x'e'y
+ set +x
$ 

相关内容