我试图在 bash 中制作一个计算器,除了乘法之外的所有东西都可以工作。 当我尝试乘法时,我的脚本将“*”变成0。 有代码:
#!/bin/bash
calculator(){
if [ $3 = "+" ] ; then
echo [ $1 $3 $2 ]
else
if [ $3 = "-" ] ; then
echo [ $1 $3 $2 ]
else
if [ $3 = "/" ] ; then
echo [ $1 $3 $2 ]
else
if [ $3 = "*" ] ; then
echo [ $1 $3 $2 ]
else
echo "$3 error"
fi
fi
fi
fi
}
calculator 1 2 *
因为当你的 shell 看到
calculator 1 2 *
时,它会首先展开所有的 glob 模式。通配符 *
表示:0 个或多个字符、任何字符(前导 .
表示隐藏文件除外)。只有在所有扩展运行之后,您的命令才会被调用。
因此,如果您的目录中有一个名为
0
的文件,则 *
将首先替换为 0
,然后调用 calculator 1 2 0
。如果目录中有多个文件,例如 0
、file.txt
、image.png
,则将调用 calculator 1 2 0 file.txt image.png
。
类似的问题也适用于您的线路
echo [ $1 $3 $2 ]
。首先,扩展参数,然后扩展未加引号的参数的路径名。因此,即使您最初调用 calculator 1 2 '*'
,该行也会首先扩展为 echo [ 1 * 2 ]
,然后进一步扩展为 echo [ 1 0 2 ]
(或 echo [ 1 0 file.txt image.png 2 ]
,具体取决于工作目录中的文件)。