2 数字的乘法和加法

2 数字的乘法和加法
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其用于变量数据,并将诊断消息输出到标准错误流上。

另请注意,具有多个选项参数的选项有点不寻常。

相关内容