特殊字符作为bash中的参数

时间:2015-12-05 18:04:03

标签: bash shell sh

我正在制作一个小型计算器,它需要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 /* 32 # 4程序无法识别出其3个参数时,如果它真的应输出最后一个else语句,则输出第一条错误消息。

2 个答案:

答案 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传递到脚本的确切参数。