web-dev-qa-db-ja.com

whileステートメントのbashまたは条件

"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

残念ながら、このコードは機能せず、無限にループします。 $result||とwhileループの2番目の部分を削除する文字列のいずれかに等しい場合にのみ比較できます。 ||-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' 
3

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
1

これは、&&ではなく||を使用したいためです。

結果がstringAではなく、stringBでもない場合は、ループを繰り返す必要があります。どちらの文字列も、ループを終了させる両方の文字列と同じにすることはできません。

[[ ... ]]でパターンを使用することもできます。

while [[ ${result,,} != string[ab] ]]
3
choroba

コードの問題は、ループが$resultbothstringAおよびstringBと同じではありません(同時に)。あなたは使いたいかもしれません

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

テキストスピーチで結果がstringaまたは結果がstringbではありませんか...

変数の周りの"に注意してください。変数$resultが空の場合はエラーになります。

2
FaxMax