Shell 脚本:转义序列字符在检索包含转义序列的变量的值时的行为如何?



我有如下所示 test.sh。当我从 bash shell 像 ./test.sh 一样运行它时,我得到的输出如下所示。

test.sh

operator="*"
echo $operator
expr 5 $operator 1
expr 5 * 2

输出

*
expr: syntax error
10

我不明白为什么它会为第三条语句提供语法错误,而第四条语句按预期工作。 如果 expr 只在第三个语句中获取 * 作为第二个参数,则如何回显输出 \*?

bash 中 shell 扩展的最后阶段是删除引号:

在前面的扩展之后,所有未加引号的 字符""、"'"和"""不是由其中之一产生的 上述扩展将被删除。

这里的"上述扩展"是参数(变量(扩展、命令替换等。

expr 5 * 2中,作为引号删除的一部分,将被 bash 删除,因为它不是变量(或其他(扩展的结果。所以在这里,expr得到的论点是*,在删除之后。

expr 5 $operator 1echo $operator中,不会被移除,因为它是变量展开的结果。因此,在这两个命令中,echoexpr得到的参数是*,而不会删除


这里最好的方法是一致地使用引号:

operator="*"
echo "$operator"
expr 5 "$operator" 2

否则,如果*恰好设置为奇怪的内容,IFS可能仍会受到字段拆分的影响:

bash-4.4$ foo='*'
bash-4.4$ echo $foo
*
bash-4.4$ IFS='*'
bash-4.4$ echo $foo

bash-4.4$ echo "$foo"
*

最新更新