我创建了一个执行计算的脚本。例如:
count 1 + 3
1 + 3 = 4
,
-
和/
也有效,但如果我输入
计数1 * 3
,我得到了
应该是数字操作数
这是脚本的一部分:
if [ "$#" -ne 3 ]; then
echo "Should be number operand number"
exit 1
fi
...
elif [ "$2" = "*" ]; then
result=`echo $1 \* $3 | bc`
echo "$1 * $3 = $result"
是的,如果我输入 \
之前*
在命令行中它可以工作,但我需要它仅使用 *
运行.
我尝试使用 set -f
在脚本内部它不起作用(是的,如果我输入 bash 本身,它会禁用特殊字符,但这不是我需要的)。还有一个shopt
命令控制 shell 行为,因此我尝试启用一些选项,例如 shopt -s globstar
, nullglob
, promptvars
等等,但没有成功。我把命令放在if语句之前,可能是错误的。
如果有人纠正我或告诉我其他方法来禁用脚本内部特殊字符的解释,我将不胜感激。
最佳答案
POSIX specification of expr 中提到了这个确切的问题,由于您所描述的原因,该工具具有“相当困难的语法”。
换句话说,这绝对是一个已知问题,而 POSIX 本身并没有解决这个问题。您确实应该考虑使用 Unix 并做同样的事情,而不是试图对抗它。
一些选项是:
要求整个表达式为一个带引号的参数,例如
计数“1 * 2”
这是一种务实、快速失败的方法,可确保参数始终被引用,以便任何 * 的引入仍然有效。 bash 内置的
let
可以做到这一点。自己阅读
表达式,例如只需运行count
,然后输入1 * 2
。这可以避免 shell 接触您的数据,以便您可以按照您想要的方式解释它。这就是
bc
和dc
所做的。接受这样一个事实:传递
*
需要仔细引用。这就是
expr
的作用。使用magic alias仅在非常特定的情况下对某些 shell 起作用的 hack。
没有人这样做,因为它很脆弱且不可预测,即使它在某些情况下允许您想要的语法。
关于bash - 如何禁用 bash 中的特殊字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37737983/