だから学習経験で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
したい場合は、次のようにします。m
M
[[ "$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