Case 問い合わせ AND 演算子

Case 問い合わせ AND 演算子

次のコードがあります。

read -p "Enter a word: " word

case $word in
  [aeiou]* | [AEIOU]*)
          echo "The word begins with a vowel." ;;
  [0-9]*)
          echo "The word begins with a digit." ;;
  *[0-9])
          echo "The word ends with a digit." ;;
  [aeiou]* && [AEIOU]* && *[0-9])
          echo "The word begins with vowel and ends with a digit." ;;
   ????)
          echo "You entered a four letter word." ;;
   *)
          echo "I don't know what you've entered," ;;
esac

私がこれを実行したとき:

Enter a word: apple123
case2.sh: line 10: syntax error near unexpected token `&&'
case2.sh: line 10: `  [aeiou]* && [AEIOU]* && *[0-9])'

Case 文は AND 演算子をサポートしていないようで、上記の Case 文では && 演算子は論理的に正しくないと思います。

if elseを使用して、入力がコレクションと数字で始まるかどうかを確認できます。しかし、ケースにAND演算子などの組み込み関数があるかどうか疑問に思います。

ベストアンサー1

あなたは正しいです。標準定義caseパターンにはAND演算子は使用できません。 「小文字の集まりで始まり、大文字の集まりで始まります」と言うと、何も一致しないことも正しいです。また、パターンと説明が数値テストの開始/終了を逆にすることに注意してください。[0-9]*単語に一致するパターンを使用してください。スタート数字ではありません終わり数字で。

1つのアプローチは、テストを同じパターンにグループ化することです。最も厳しいパターンから始まります。

case $word in
  ([AaEeIiOoUu]??[0-9]) echo it is four characters long and begins with a vowel and ends with a digit;;
  ([AaEeIiOoUu]*[0-9])  echo it is not four characters long begins with a vowel and ends with a digit;;
# ...
esac

別の(長時間!)アプローチは、caseステートメントをネストして、毎回適切な応答を構築することです。コレクションから始めますか?はいまたはいいえ?さて、数字で終わります、はい、またはいいえ?これはすぐに扱いにくく、メンテナンスが面倒になる可能性があります。

別のアプローチは、「否定的な」フィードバックを提供したい場合は、一連のcase文を使用して適用可能な文の文字列(または配列)を構築することです(「単語true;*いいえコレクションから始めます」など)。

result=""
case $word in
  [AaEeIiOoUu]*)
          result="The word begins with a vowel." ;;
esac

case $word in
  [0-9]*)
          result="${result} The word begins with a digit." ;;
esac

case $word in
  *[0-9])
          result="${result} The word ends with a digit." ;;
esac

case $word in
   ????)
          result="${result} You entered four characters." ;;
esac

printf '%s\n' "$result"

いくつかの例:

$ ./go.sh
Enter a word: aieee
The word begins with a vowel.
$ ./go.sh
Enter a word: jeff42
 The word ends with a digit.
$ ./go.sh
Enter a word: aiee
The word begins with a vowel. You entered four characters.
$ ./go.sh
Enter a word: 9arm
 The word begins with a digit. You entered four characters.
$ ./go.sh
Enter a word: arm9
The word begins with a vowel. The word ends with a digit. You entered four characters.

または、casebash は文の構文を拡張します。次にパターンを終了すると、複数のパターンを選択できます;;&

shopt -s nocasematch
case $word in
  [aeiou]*)
          echo "The word begins with a vowel." ;;&
  [0-9]*)
          echo "The word begins with a digit." ;;&
  *[0-9])
          echo "The word ends with a digit." ;;&
   ????)
          echo "You entered four characters." ;;
esac

*この方法でパターンをナビゲートすると、何でも一致するため、包括的なパターンを削除しました。 Bashには上記で設定したシェルオプションもあります。nocasematchこれにより大文字と小文字を区別せずにパターンを一致させることができます。これは重複を減らすのに役立ちます。| [AEIOU]*パターンの一部を削除しました。

いくつかの例:

$ ./go.sh
Enter a word: aieee
The word begins with a vowel.
$ ./go.sh
Enter a word: jeff42
The word ends with a digit.
$ ./go.sh
Enter a word: aiee
The word begins with a vowel.
You entered four characters.
$ ./go.sh
Enter a word: 9arm
The word begins with a digit.
You entered four characters.
$ ./go.sh
Enter a word: arm9
The word begins with a vowel.
The word ends with a digit.
You entered four characters.

おすすめ記事