次のコードがあります。
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.
または、case
bash は文の構文を拡張します。次にパターンを終了すると、複数のパターンを選択できます;;&
。
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.