Bash または while 文の条件

Bash または while 文の条件

bash で、ユーザー入力が「stringA」または「stringB」と等しいかどうかをチェックし、これらの文字列のいずれかと等しい場合はユーザー入力を出力するスクリプトを記述したいと思います。コードは次のとおりです。

#!/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 番目の部分$resultを削除して、 が文字列の 1 つと等しいかどうかのみを比較できます。を に||置き換えようとしましたが、次のエラーが発生しました。||-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

textspeech では、結果が文字列 a または結果が文字列 b ではない場合に、次の操作を実行します...

変数の周囲に注意してください"。そうしないと、var が空の場合にエラーが発生します$result

答え3

あなたのコードの問題は、ループがループしているのが$result両方 stringAstringB(同時に)。

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!

答え4

バリアントであり、ロケールを使用して文字列を変換することshに関連する問題を排除します(たとえば、小文字はすべての人に適しているわけではありません)。${var,,}Ii

#! /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

関連情報