我正在制作一个小型计算器,它需要3个命令行参数,如sh programname operand1 operator operand2
并计算其值。我希望用户只输入3个参数和一个只能是+,-,x,/,%,^
的运算符。我遇到的问题是当用户输入#
或/*
时程序没有输出正确的错误消息。
我的代码:
#!/bin/sh
if [ ! $# == 3 ]
then
echo "Usage: sh $0 operand1 operator operand2 "
exit 1
fi
n1=$1 op=$2 n2=$3
if [ $2 == "+" ]; then
ans=`expr $n1 + $n2`
echo "$ans"
elif [ $2 == "-" ]; then
ans=`expr $n1 - $n2`
echo "$ans"
elif [ $2 == "x" ]; then
ans=`expr $n1 \* $n2`
echo "$ans"
elif [ $2 == "/" ]; then
ans=`expr $n1 / $n2`
echo "$ans"
elif [ $2 == "%" ]; then
ans=`expr $n1 % $n2`
echo "$ans"
elif [ $2 == "^" ]; then
echo $((n1**n2))
else
echo "Error: invalid operator"
exit 1
fi
当用户2 /* 3
或2 # 4
程序无法识别出其3个参数时,如果它真的应输出最后一个else语句,则输出第一条错误消息。
答案 0 :(得分:3)
那是因为*
(glob扩展一切)和#
(评论)在shell中有不同的含义。
使用运算符周围的单引号运行脚本,例如:
# 2 '*' 3
# 2 '#' 4
您的程序并未真正处理/*
个案。所以我假设*
。
答案 1 :(得分:1)
这是你无法控制的。
用户在shell中输入命令字符串,将#
解释为“此行的其余部分是注释”,将/*
解释为“/目录中的所有内容”。
演示:
~$ echo hello # there
hello
~$ echo /*
/bin /boot /cdrom /dev /etc /home /initrd.img /initrd.img.old /lib /lib32 /lib64 /libx32 /lost+found /media /mnt /opt /proc /root /run /sbin /srv /sys /tmp /usr /var /vmlinuz /vmlinuz.old
您还可以通过执行echo "$@"
来查看从shell传递到脚本的确切参数。