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
また、複数のオプション引数を使用するオプションは少し変わります。