"stringA"または "stringB"と等しい場合にユーザー入力をチェックするスクリプトをbashで記述し、これらの文字列のいずれかに等しい場合にユーザー入力を出力する必要があります。私のコードは:
#!/bin/bash
echo "Please enter your choice (stringA or stringB): "
read result
while [[ (${result,,} != 'stringa') || (${result,,} != 'stringb') ]]; do
echo Please enter only stringA or stringB:
read result
done
echo "You have selected $result!"
exit
残念ながら、このコードは機能せず、無限にループします。 $result
が||
とwhileループの2番目の部分を削除する文字列のいずれかに等しい場合にのみ比較できます。 ||
を-o
に置き換えようとしましたが、次のエラーが発生しました:
./chk.sh: line 12: syntax error in conditional expression
./chk.sh: line 12: syntax error near `-o'
./chk.sh: line 12: `while [[ (${result,,} != 'stringa') -o (${result,,} != 'stringb') ]]; do'
sh
バリアント。ロケールを使用して文字列を変換する${var,,}
に関連する問題を削除します(たとえば、小文字のI
は、すべてのユーザーに対してi
ではありません)。
#! /bin/sh -
while true; do
printf %s "Please enter your choice (stringA or stringB): "
IFS= read -r result || exit # exit on EOF
case $result in
([sS][tT][rR][iI][nN][gG][aAbB]) break
esac
echo >&2 Invalid choice.
done
これは、&&
ではなく||
を使用したいためです。
結果がstringAではなく、stringBでもない場合は、ループを繰り返す必要があります。どちらの文字列も、ループを終了させる両方の文字列と同じにすることはできません。
[[ ... ]]
でパターンを使用することもできます。
while [[ ${result,,} != string[ab] ]]
コードの問題は、ループが$result
はbothstringA
およびstringB
と同じではありません(同時に)。あなたは使いたいかもしれません
while [[ "${result,,}" != 'stringa' ]] && [[ "${result,,}" != 'stringb') ]]
または
until [[ "${result,,}" == 'stringa' ]] || [[ "${result,,}" == 'stringb') ]]
ユーザーにいくつかの選択肢の1つを選ばせるには、長い文字列を入力させないでください。代わりに、選択するシンプルなメニューを提供します。
提案:
#!/bin/bash
PS3='Your choice: '
select result in 'stringA' 'stringB'; do
case $REPLY in
[12])
break
;;
*)
echo 'Invalid choice' >&2
esac
done
printf 'You picked %s!\n' "$result"
これを実行する:
$ bash script.sh
1) stringA
2) stringB
Your choice: 3
Invalid choice
Your choice: 2
You picked stringB!
#!/bin/bash
echo "Please enter your choice (stringA or stringB): "
read result
while ! [ "${result,,}" = 'stringa' -o "${result,,}" = 'stringb' ]; do
echo Please enter only stringA or stringB:
read result
done
echo "You have selected $result!"
exit
テキストスピーチで結果がstringaまたは結果がstringbではありませんか...
変数の周りの"
に注意してください。変数$result
が空の場合はエラーになります。