予想される整数式を取得するのはなぜですか?

予想される整数式を取得するのはなぜですか?

だから学習経験でbashでメニューシステムを作ってみました。これを行う方法は数え切れないほど多く、さらに「より良い」方法があると確信しています。しかし、私が持っている方法は次のとおりです。

echo "
2nd Menu
********
1) command
2) command
M) Main menu
X) Exit program
"
read -p "Choose option >" opt
if [ "$opt" -eq 1 ]; then
    commands
elif [ "$opt" -eq 2 ]; then
    commands
elif [[ "$opt" = [m,M] ]]; then
    main #calls the function main()
elif [[ "$opt" = [x,X] ]]; then
    exit
else
    echo "Invalid option"
    main
fi

このスクリプトは、「X)プログラムの終了」を除くすべてのオプションで動作します。 「X」または「x」を実行すると、このエラーが発生します。

./acct-mgr.sh: line 10: [: x: integer expression expected
./acct-mgr.sh: line 12: [: x: integer expression expected
Invalid option

これは私を混乱させる!私は、各データ型(整数の場合は-eq、文字列の場合は=)に対して正しい比較演算子を使用しており、「x」を除くすべてのオプションが機能すると確信しています。

どんな助けでも大変感謝します。ありがとうございます。

PS - あなたが望む結果を得るための別の方法を教えてくれてありがとう。しかし、それにもかかわらず、なぜこれが私の経験的な方法には適用されないのかを知りたいです。もう一度ありがとうございます。

答え1

M / mまたはX / xを入力すると、数値以外の数値を数値と比較するため、-eqエラーが発生します。時々文字列になりたい場合は、$opt常に文字列として扱います。

...
if [ "$opt" = "1" ]; then
    commands
elif [ "$opt" = "2" ]; then
    commands
...

答え2

サプリメントとして@アンディはすでに言いました、気づく

[[ "$opt" = [m,M] ]]

m、および .,一致し、一致のみをMしたい場合は、次のようにします。mM

[[ "$opt" = [mM] ]]

ここでは標準構成を使用しますcase

case $opt in
  (1)   commands;;
  (2)   commands;;
  (m|M) main;;
  (x|X) exit;;
  (*)   echo >&2 "Invalid option"; main
esac

また、の動作は のread現在値によって異なります$IFS。ユーザーから行を読み取るには、次を使用できます。

IFS= read -r opt

文字を読む:

IFS= read -rn1 opt

行って読んでください。言葉(1行を読みますが、先頭のスペースとタブと最初の単語を除くすべての項目は無視されます):

IFS=$' \t' read -r opt ignored

または、以下で使用を許可します。言葉バックスラッシュプレフィックスを追加すると、次のようになります。

IFS=$' \t' read opt ignored

関連情報