初心者のスクリプトヘルプ

初心者のスクリプトヘルプ

私は2つの整数を要求してからa / s / m / dを選択して、加算、減算、乗算、または除算を要求するクラス用のスクリプトを作成しています。また、整数と有効なオプションを入力したことを確認しますが、これについては後で説明します。今これが私が持っているものです:

#!/bin/bash
echo "Please input a whole number"
read num1
echo "Please input another whole number"
read num2
echo "Please input funtion: [a] for addition, [s] for subtraction, [m] for multiply, or [d] for divide"
read func

if [ "$func" -eq "a" ]; then
       echo $((num1 + num2))
fi 

if [ "$func" -eq "s" ]; then
       echo $((num1 - num2))
fi 

if [ "$func" -eq "m" ]; then
       echo $((num1 * num2))
fi 

if [ "$func" -eq "d" ]; then
       echo $((num1 / num2))
fi 

else
echo "Please select only [a] for addtion, [s] for subtration, [m] for multiply, or [d] for divide"

実行すると、コンテンツを正しく要求しても理解できないエラーが発生します。

./MathTest.sh: line 9: [: a: integer expression expected
./MathTest.sh: line 13: [: a: integer expression expected
./MathTest.sh: line 17: [: a: integer expression expected
./MathTest.sh: line 21: [: a: integer expression expected
./MathTest.sh: line 25: syntax error near unexpected token `else'
./MathTest.sh: line 25: `else'

誰でもこの問題を解決するのに役立ちますか?

ベストアンサー1

  1. =整数比較()の代わりに文字列比較()を使用する必要がありますeq

  2. スクリプトに対応elseするステートメントがありませんif。一連の if/then/else if/then/.../else ステートメントを実行するには、if ... elif ... elif .... else ... fi代わりに ... を使用する必要があります。if ... fi; if ... fi; if ... fi; else または氏名を使用してくださいcase

    明確でなければelifという意味ですelse if

    たとえば、

#!/bin/bash
echo "Please input a whole number"

read num1

echo "Please input another whole number"

read num2

echo "Please input funtion: [a] for addition, [s] for subtraction, [m] for multiply, or [d] for divide"

read func

case "$func" in
  a) echo $((num1 + num2)) ;;
  s) echo $((num1 - num2)) ;;
  m) echo $((num1 * num2)) ;;
  d) echo $((num1 / num2)) ;;
  *) echo "Please select only [a] for addtion, [s] for subtration, [m] for multiply, or [d] for divide" ;;
esac

各ケースのコードは2つのセミコロンで終わる必要があることに注意してください;;。これは、各ケースに複数のコードステートメントがある可能性があるためです(改行または単一のセミコロンで区切られています)。したがって、シェルインタプリタは他の状況を区別する方法が必要です。事件と事件の終わり、そして;;それが何をするために使用されるか。

ケースごとに2つのドアを示す簡単な例:

case "$func" in
  a) echo "addition:"    ; echo $((num1 + num2)) ;;
  s) echo "subtraction:" ; echo $((num1 - num2)) ;;
...
esac

caseステートメント(私の意見では、コードを読みやすくし、確かに短くて少なく繰り返します)ではなく、次のようにif / elif / else / fiを使用できます。

if [ "$func" = "a" ]; then
  echo $((num1 + num2))
elif [ "$func" = "s" ]; then
  echo $((num1 - num2))
elif [ "$func" = "m" ]; then
  echo $((num1 * num2))
elif [ "$func" = "d" ]; then
  echo $((num1 / num2))
else
  echo "Please select only [a] for addtion, [s] for subtration, [m] for multiply, or [d] for divide"
fi 

これは比較=ではなく使用-eqを意味します(数字以外の文字列を比較するためです)、単一のif ... fiステートメントではなく、if、elif、elif、elif、else、fiステートメントの長いリストです。

ちなみに、if / elif / fiチェーンといくつかのif ... fiステートメントの間には非常に重要な違いがあります。 if/elif/elif/elif/.../else/fiの場合のみ最初真の結果は永久に実行され(そのどれも真でなければelseコードが実行されます)、ステートメントの動作case ... esac方法と同様に、シェルはチェーン全体の終わりにジャンプします。

複数のif ... fiステートメントの場合、各ステートメントは順番に評価され、true と評価される各ステートメントは、他のすべてのテストとは独立して実行されます。

おすすめ記事