ANDまたはORのいくつかの基本についての助けが必要です。

ANDまたはORのいくつかの基本についての助けが必要です。

私が戸惑うようないくつかの質問があります。これは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 selectionY、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]と一致するなど、さまざまなオプションがあります。yYyuck, no!


while [ "$argument" != "Y" ] || [ "$argument" != "YES" ] ... 

私はここで何が間違っているのかわかりません。

この場合、ロジックを手動で完了すると便利です。argumentyesと仮定するYと、[ "$argument" != "Y" ]偽で真である[ "$argument" != "YES" ]ため、結果は次のようになります。またはそれは真実だ。他の値に対してもこれを繰り返すと、比較の少なくとも1つが常に真であることがわかります。

関連情報