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 1
和echo $operator
,不会被删除,因为它是可变扩展的结果。所以在这两个命令中,
echo
和expr
得到的论点是*
,没有删除。
这里最好的方法是始终使用引号:
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脚本:转义序列字符在检索带有转义序列的变量值时如何表现?的主要内容,如果未能解决你的问题,请参考以下文章