Shell脚本:转义序列字符在检索带有转义序列的变量值时如何表现?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell脚本:转义序列字符在检索带有转义序列的变量值时如何表现?相关的知识,希望对你有一定的参考价值。

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

test.是

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

产量

*
expr: syntax error
10

我不明白为什么它会给第三个语句带来语法错误,而第四个语句按预期工作。如果expr在第三个语句中只获得*作为第二个参数,那么echo输出如何?*?

答案

bash中shell扩展的最后阶段是quote removal

在前面的扩展之后,所有未加引号出现的字符'','''和'"'都不会出现上述扩展之一。

这里的“以上扩展”是参数(变量)扩展,命令替换等。

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"
*

以上是关于Shell脚本:转义序列字符在检索带有转义序列的变量值时如何表现?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Go 通过 SSH 发送终端转义序列?

将 Python 转义的 unicode 序列转换为 UTF-8

转义字符_MySQL识别下面的转义序列

C++特殊字符转义序列

从C#目录中删除转义序列

ANSI 颜色转义序列字符出现在 String.length();