私が戸惑うようないくつかの質問があります。これはBashの論理に従うようです。
if [ "$argument" = "Y" -o "$argument" = "YES" ];
then
…
fi
この文を2回使用せずに作成する方法はありますか"$argument"
?はい、わかったように3〜4個の回答を追加するにはどうすればこれを拡張できますか?
第二に、
while [ "$argument" != "Y" ] || [ "$argument" != "YES" ] || [ "$argument" != "N" ] || [ "$argument" != "NO" ]; do
echo "Not a valid selection"
done
ここで何が間違っているのかわかりませんが、どの文を入力しても$argument
常にNot a valid selection
Y、YES、N、またはNOを許可しないというメッセージが表示されます。
答え1
あなたの例では、常に答えが無効であるとマークされています。これは、あなたが書いたロジックが動作する実際の例がないためです。その価値が何であれ、そう$argument
するでしょう。いつもY
は、またはと同じではありませんYES
。あたかもこの値の一つのようにできない他人になってください。
次の内容を確認してくださいcase
。
valid=0
while [[ valid -eq 0 ]]; do
read -p 'Really? > ' argument
case "$argument" in
Y*|y*)
valid=1
: handle 'yes' cases
;;
N*|n*)
valid=1
: handle 'no' cases
;;
*)
printf 'Invalid input "%s". Please say "yes" or "no".\n' "$argument" 1>&2
;;
esac
done
答え2
if [ "$argument" = "Y" -o "$argument" = "YES" ]; then
「$argument」を2回使用せずにこのステートメントを生成する方法はありますか?
標準シェルには次のものがありますcase
。
case $argument in
Y|YES) echo "it's 'Y' or 'YES'";;
*) echo "it's something else";;
esac
Bash/Ksh/Zsh では正規表現を使用します。
if [[ $argument =~ Y|YES ]]; then
...
Bash / Ksh(またはを持つZsh setopt kshglob
)はKshスタイルの拡張グローブを使用します。
if [[ $argument = @(Y|YES) ]]; then
...
もちろん、regex^Y(ES)?$
または(含む)で始まる項目^[yY]
と一致するなど、さまざまなオプションがあります。y
Y
yuck, no!
while [ "$argument" != "Y" ] || [ "$argument" != "YES" ] ...
私はここで何が間違っているのかわかりません。
この場合、ロジックを手動で完了すると便利です。argument
yesと仮定するY
と、[ "$argument" != "Y" ]
偽で真である[ "$argument" != "YES" ]
ため、結果は次のようになります。またはそれは真実だ。他の値に対してもこれを繰り返すと、比較の少なくとも1つが常に真であることがわかります。