ユーザー入力が「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
残念ながら、このコードは機能せず無限に繰り返されます。 whileループの2番目の部分を削除する文字列の1つと同じ場合にのみ比較できます$result
。交換しよう||
としましたが、次のエラーが発生します。||
-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'
答え1
を使いたいからです&&
。||
結果がstringAでもstringBでもない場合は、ループを繰り返す必要があります。どちらの文字列も両方と同じではないため、ループは終了します。
以下でパターンを使用することもできます[[ ... ]]
。
while [[ ${result,,} != string[ab] ]]
答え2
#!/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
TTS(text-to-speech)では、結果がstringaではないか、結果がstringbですが...
"
変数に注意してください。それ以外の場合、$result
varが空の場合はエラーメッセージが表示されます。
答え3
コードの問題はwhileループです$result
。両方 stringA
そしてstringB
(同時に)。使いたいかもしれません
while [[ "${result,,}" != 'stringa' ]] && [[ "${result,,}" != 'stringb') ]]
または
until [[ "${result,,}" == 'stringa' ]] || [[ "${result,,}" == 'stringb') ]]
ユーザーが複数のオプションのいずれかを選択できるようにするには、長い文字列を入力しないでください。代わりに選択できる簡単なメニューを提供してください。
提案:
#!/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!
答え4
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