「整数式が必要です」エラー

「整数式が必要です」エラー

次のスクリプトを実行しています。

#!/bin/bash
# This script acts as a simple calculator for add, subtract, multiply and divide.
echo "Kindly ENTER 'a' to select for addition"
echo "Kindly ENTER 's' to select for subtraction"
echo "Kindly ENTER 'm' to select for multiplication"
echo "Kindly ENTER 'd' to select for division"
read oper
echo "Please ENTER any number of your choice"
read no1
echo "Please ENTER another number of your choice"
read no2
if [ $oper -eq a ]; then 
echo "Your addition result is: $(($no1 + $no2))" 
elif [ $oper -eq s ]; then 
echo "Your subtraction result is: $(($no1 - $no2))"
elif [ $oper -eq m ]; then 
echo "Your multiplication result is: $(($no1 * $no2))"
elif [ $oper -eq d ]; then 
echo "Your division result is: $(($no1 / $no2))"
else echo "Your selection from the begining was incorrect"
fi

エラー/出力は次のとおりです。

./test2.sh: line 12: [: m: integer expression expected
./test2.sh: line 13: [: m: integer expression expected
./test2.sh: line 14: [: m: integer expression expected
./test2.sh: line 15: [: m: integer expression expected
Your selection from the begining was incorrect

理由は何ですか?

答え1

この-eq演算子は、整数値に関連付けられた関係演算子です。これらの演算子は、値が整数でない限り、文字列値では機能しません。

したがって、=2つの文字列オペランドの値が同じであることを確認するには、whichを使用します。

答え2

他の人が言ったように、整数-eqでのみ動作する比較演算子です。シェルテストユーティリティには、さまざまな目的のために複数のオペランドがあります。それらをよりよく理解することが役に立つかもしれません。

ファイルテスト演算子

  • -b- ファイルがブロック特殊ファイルの場合はtrue
  • -c- ファイルが文字特殊ファイルの場合はTrue。
  • -d- ファイルがディレクトリの場合はtrue
  • -e- ファイルが存在する場合はtrue
  • -f- ファイルが「一般ファイル」の場合はTrueです。
  • -g- ファイルに SGID ビットがセットされている場合は真です。
  • -h- ファイルがシンボリックリンクの場合はtrue
  • -L- ファイルがシンボリックリンクの場合はtrue
  • -p- ファイルがFIFOの場合はtrue
  • -r- ファイルに対する読み取り権限がある場合はTrue。
  • -S- ファイルがAAソケットの場合はtrueです。
  • -s- ファイルサイズが0より大きい場合はTrueです。
  • -u- ファイルに setuid フラグが設定されている場合は真です。
  • -w- ファイルへの書き込み権限がある場合はTrue。
  • -x– ファイルに対する実行権限がある場合は True。

文字列演算子(整数で動作しますが文字列として扱われます)

  • =- 左の文字列が右の文字列と等しい場合は真
  • !=- 左の文字列が右の文字列と等しくない場合は真です。
  • -z- 文字列の長さが0の場合はtrue
  • -n- 文字列の長さが0でない場合はtrue
  • string- 文字列が存在する場合はtrue

関係演算子(文字列では機能しません)

  • -eq- 左の整数が右の整数と等しい場合は真です。
  • -ne- 左の整数が右の整数と等しくない場合は真です。
  • -gt- 左の整数が右の整数より大きい場合は真です。
  • -ge- 左の整数が右の整数以上であれば真。
  • -lt- 左の整数が右の整数より小さい場合は真です。
  • -le- 左の整数が右の整数以下であれば真。

ブール演算子

  • !- 式が偽ならば真
  • -o- 左式または右式のいずれかが真なら真
  • -a- 左辺と右辺が両方とも真であれば真

算術演算子(シェル算術拡張または内部expr

  • +- 演算子の両側に値を追加します。
  • -- 左の整数から右の整数を引く。
  • *- 演算子の両方の値を掛けます。
  • /- 左の整数を右の整数で割ります。
  • %- 左の整数を右の整数で除算し、残りを返します。
  • =- 右手を左手に割り当てる
  • ==- 2つの整数が等しい場合は真
  • !=- 2つの整数が等しくない場合は真

その他

  • -t- ファイル記述子が開いていて端末に接続されている場合は真です。

答え3

教育目的で電卓をコーディングする別の方法です。ただ心を落ち着かせてください。

#!/bin/bash
declare -A operations=([addition]=+ [subtraction]=- [multiplication]='*' [division]=/)
PS3="Which calculation do you want? "
select ans in "${!operations[@]}" quit; do
    [[ $ans == quit ]] && break
    [[ -z $ans ]] && continue
    read -p "Enter two numbers separated by a space: " -r a b x
    echo "Your $ans result is: $(( a ${operations[$ans]} b ))"
done

  1. PS3selectプロンプトに使用されるbash変数。たとえば、無効な応答を入力した場合は、selectが必要なだけ頻繁にプロンプ​​トを表示するため、これはechoよりも優れています。
  2. isを引用すると、'*'ファイル名のリストに展開されるのを防ぐことができます。バラよりファイル名拡張子bashのマニュアルから。振り返ってみると、これはおそらく必要ではなかったでしょう。一般に、bashを使用すると、疑わしい場合は引用符を追加するのが通常正しいアプローチです。

答え4

@steeldriverが書いた=ように-eq

関連情報