スクリプトで+、-、x、/文字をパラメータとして使用する方法

スクリプトで+、-、x、/文字をパラメータとして使用する方法

私はスクリプトの引数($ 1、$ 2、$ 3)を使用して基本計算を実行するcalc.shというスクリプトを作成しようとしています。たとえば、./calc.sh 10/5の結果として2を取得したいとします。

私が始めた方法は次のとおりです。

if [ $2 -eq "+" ] ; then res=`expr $1 + $3` ; echo "$res" ; fi

しかし、うまくいきません。次の結果が表示されます。 Line 2: [+: 整数式が必要です。

これで、比較に==を使用し、/を除くすべての項目でうまく機能します。これでコードは次のようになります。

if [ $2 == "+" ] ; then res=`expr $1 + $3` ;
elif [ $2 == "-" ] ; then res=`expr $1 - $3` ;
elif [ $2 == "x" ] ; then res=`expr $1 \* $3` ;
elif [ $2 == "/" ] ; then res=`expr $1 \/ $3` ;
else res=`Operación no válida` ;
fi ; echo "$res"

ただし、しようとすると、次のメッセージ./calc.sh 10 / 5 が表示されます。 "行 4: 10/5: 構文エラー: 無効な算術演算子 (エラー要素は"\5")... ああ、これを入力しながら $1/$3 でなければならないことに気づきました。 .
:)

答え1

bashシェルを使用している場合は、次のことを試すことができます。

if [ $2 == "+" ] ;then
 res=$(($1 + $3))
 echo $res 
fi

編集する

'次の行を変更します(byで置き換えられます")。

else res=`Operación no válida` ;

到着する:

else res="Operación no válida" ;

編集2

if elseあまりにも多くのステートメントを使用する代わりに、Caseステートメントを使用できます。

case $2 in
+)
  res=`expr $1 + $3`
  ;;
-)
  res=`expr $1 - $3`
  ;;
/)
  res=`expr $1 \/ $3`
  ;;
x)
  res=`expr $1 \* $3`
  ;;
*)
  res="Operación inválida"
  ;;
esac

echo "$res"

答え2

スクリプト:

#!/bin/sh
IFS=" " # join arguments with a space character
echo "$* = $(( $* ))"

それによって+容易です:

./calc.sh 10 + 2
10 + 2 = 12

ただし、アスタリスクはエスケープする必要があります。

./calc.sh 10 \* 2
10 * 2 = 20

または

./calc.sh 10 "*" 2
10 * 2 = 20

答え3

@AlexPがすでに指摘したように、文字列比較ではなく算術を実行します。

私も使用を強くお勧めします二重括弧 [[]]個別にではなく。

その後、コードは次のように書くことができます。

#!/bin/bash

if [[ $2 == "+" ]]; then
    echo $(($1+$3))
elif [[ $2 == "/" ]]; then
    echo $(($1/$3))
fi

実行例:

./math.sh 2 + 7
9
./math.sh 7 / 2
3

答え4

+-またははシェルまたはコマンドには適用さxれません。あなたの質問は次のとおりです/[

  • -eq数値比較のため。=文字列比較の代わりに使用
  • 変数を引用するのを忘れました。
  • ==標準sh [演算子ではない

だから:

if [ "$2" = + ]; then
  res=`expr "$1" + "$2"`
fi

またはcaseコンストラクタを使用してください。

case $2 in
  + | - | /) res=`expr "$1" "$2" "$3"`;;
          x) res=`expr "$1" "*" "$3"`;;
          *) echo >&2 invalid; exit 1;;
esac

exprこれは、古代のシステムを処理する必要がある場合にのみ使用されることに注意してください。最新の標準sh実装には演算子による算術拡張が組み込まれており、代わりにより$((...))良い形式のコマンド置換を使用します。$(...)`...`

関連情報