首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >2数字乘加

2数字乘加
EN

Unix & Linux用户
提问于 2018-12-19 05:24:31
回答 1查看 41关注 0票数 0
代码语言:javascript
复制
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之后给出两个数字,所以当我运行我的代码时,我希望这样做

代码语言:javascript
复制
./code.sh -m 2 2 -p 5 5  

Multiplying=4 Adding=10   

我的代码简单地跳过了and -p部分,然后直接转到

代码语言:javascript
复制
*) echo "Something wrong"

我做错什么了?

EN

回答 1

Unix & Linux用户

发布于 2018-12-19 06:55:49

代码语言:javascript
复制
#!/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用于变量数据,从而将诊断消息输出到标准错误流中。

还请注意,使用多个选项参数的选项是有点不寻常的。

票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/489826

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档