M="Wrong"
P="Wrong"
I=$1
while [ "$I" != "" ]
do
case $I in
-m | --multiplying)
shift
M=`expr $1 \* $2`
;;
-p | --plus )
shift
P=`expr $1 + $2`
;;
*) echo "Something wrong"
exit 1
;;
esac
shift
I=$1
done
echo "Multiplying=$M, Adding=$P" 我在每个-m和-p之后给出两个数字,所以当我运行我的代码时,我希望这样做
./code.sh -m 2 2 -p 5 5
Multiplying=4 Adding=10 我的代码简单地跳过了and -p部分,然后直接转到
*) echo "Something wrong"我做错什么了?
发布于 2018-12-19 06:55:49
#!/bin/sh
M="Wrong"
P="Wrong"
while [ "$#" -gt 0 ]; do
case $1 in
-m|--multiplying)
M=$(( $2 * $3 ))
;;
-p|--plus)
P=$(( $2 + $3 ))
;;
*) echo 'Error in command line options' >&2
exit 1
esac
shift 3
done
printf 'Multiplying=%s, Adding=%s\n' "$M" "$P"由于分散了shifts,您的代码有点难以理解,但主要问题是每个循环缺少一个shift操作。您的脚本正确地计算了第一个算术操作的结果,但是当谈到第二个算术操作时,它只执行了两个移位操作(每个-p A B需要处理三个shift,下面的-m C D是$1、$2和$3)。
我修改的代码版本在每次操作后只执行一个shift 3,而操作本身使用$1、$2和$3。我还使用了更现代的算术扩展$(( ... )),而不是过时的expr实用程序。我正在$#上测试是否有更多的命令行参数需要处理,并且我稍微更新了输出,以便printf用于变量数据,从而将诊断消息输出到标准错误流中。
还请注意,使用多个选项参数的选项是有点不寻常的。
https://unix.stackexchange.com/questions/489826
复制相似问题