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
我的代码只是跳过和 -p 部分并直接进入
*) echo "Something wrong"
我究竟做错了什么?
答案1
#!/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"
由于 s 分散,您的代码有点难以理解shift
,但主要问题是每个循环缺少一个shift
操作。您的脚本正确地计算了第一个算术运算的结果,但在查看第二个算术运算时,它只执行了两次移位操作(每个移位操作需要处理-p A B
三个,并且后续操作位于,和中)。shift
-m C D
$1
$2
$3
我的代码的修改版本仅在每次操作后执行一次shift 3
,而操作本身使用$1
,$2
和$3
。我还使用更现代的算术扩展$(( ... ))
而不是过时的expr
实用程序。我正在测试$#
是否有更多命令行参数需要处理,并且我稍微更新了输出,以便将printf
其用于变量数据,并将诊断消息输出到标准错误流上。
另请注意,具有多个选项参数的选项有点不寻常。