【发布时间】:2016-10-10 19:35:21
【问题描述】:
我创建了一个执行计算的脚本。例如:
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 语句之前可能是错误的。
如果有人纠正我或告诉其他方式以禁用脚本内部对特殊字符的解释,我将不胜感激。
【问题讨论】:
-
当您运行
count 1 * 3时,*将替换为在调用count之前的文件名列表。这意味着count不可能做任何事情来阻止它。替换发生在加载之前,甚至在磁盘上被识别。 -
好的,谢谢,那我得用另一种方式重写脚本了……
-
@Josh 我的回答包括另一种方式。
-
只使用单引号,一些shell函数示例:
f() { echo $(( $1 )) ; },然后是f '2 * 32',打印64。首选 STDIN,执行:f() { while read x ; do echo $(( $x )) ; done ; },使用它来打印前十个阶乘:for x in $(seq 10) ; do seq -s'*' $x | f ; done。
标签: bash shell special-characters positional-parameter