我有如下所示 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 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"
*