という変数がありますchoice
。choice
nullではなく同じになるまでyes
値を入力するように求められますno
。
つまり、choice
空または他のyes
場合はno
、選択内容を入力します。
Javaで書いた場合、式はお粥になります。
while (choice.IsEmpty() || (!choice.equals("yes") && !choice.equals("no"))
shell
ただし、コンテンツ(二重引用符の間のvar)構文を使用しないと、次のように翻訳する方法が見つかりません。
while [ "$choice" != "yes" && "$choice" != "no" ]
明らかに動作しますが、私が個人的に知っている限り、Javaのようにテストできる別の方法はありますか?
ベストアンサー1
これ
while [ "$choice" != "yes" && "$choice" != "no" ]
コマンド&&
に違反しているため、実際には機能しません。[
次のいずれかの方法を使用します。
while [ "$choice" != "yes" ] && [ "$choice" != "no" ]
while [[ "$choice" != "yes" && "$choice" != "no" ]]
Bashやその他の機能が豊富なシェルでは、正規表現のマッチングも使用できます。
while [[ ! $choice =~ ^(yes|no)$ ]]
または、少なくともBashとZshで明示的に有効にする必要があるかもしれないkshスタイルの拡張グローブ:
# shopt -s extglob # Bash, though not needed within [[ .. ]]
# in recent versions
# setopt kshglob # Zsh
while [[ $choice != @(yes|no) ]]
あるいは、ZshはZshの自己拡張glob構文を使用します。
while [[ $choice != (yes|no) ]]
(例えばこの回答 さまざまな拡張グローバル間の関係に使用されます。 )