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のそれぞれの後に2つの数字を与えるので、
コードを実行するときにこれが起こりたいと思います。

./code.sh -m 2 2 -p 5 5  

Multiplying=4 Adding=10   

私のコードはand -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作業がないことです。スクリプトは最初の算術演算の結果を正しく計算しますが、2番目の算術演算を見ると2つのシフト演算のみを実行します(-p A B各シフト演算は3つずつ処理する必要があり、その後の演算はatとinです)。shift-m C D$1$2$3

私のコードの修正版は各タスクの後に一度だけ実行されますshift 3が、タスク自体はとを使用します$1。また、古いユーティリティの代わりに最新の算術拡張を使用します。処理するコマンドライン引数があるかどうかをテストしていますが、可変データを使用して標準エラーストリームに診断メッセージを印刷するように出力を少し更新しました。$2$3$(( ... ))expr$#printf

また、複数のオプション引数を使用するオプションは少し変わります。

関連情報