私が書いたコードです。読み取った文字が大文字、小文字、または特殊記号であることを確認するには、if elifを使用する単純なコードが必要です。
echo "enter a char"
read c
if [[ $c == [A-Z] ]];
then
echo "upper"
elif [[ $c == [a-z] ]];
then
echo "lower"
else
echo "Digit or special symbols!"
fi
以下は、文字を入力した後に受信される出力です。
enter a char
A
upper
enter a char
a
Digit or special symbols!
aravind@bionic-beaver:~/Desktop$ ./1.sh
enter a char
1
Digit or special symbols!
答え1
オプションをクリアして$IFS
追加しない限り-r
、read
非常に具体的な方法で入力行を読みます。。
たとえば、ユーザーがを入力すると、ユーザーが入力した値の代わりに" \x "
デフォルト値が含まれます$IFS
。$c
x
また、小文字と一致せず、[a-z]
ロケールa
内とロケールの間のすべての型と一致しますz
(シェル間の動作に若干の違いがあります。たとえば、bash
多くのロケールでは、AとYの間の英語の文字が含まれます)。特定のロケールと特定のツールの文字シーケンスも一致させることができます。
ここでは、次のことができます。
printf >&2 'Please enter a character: '
IFS= read -r c
case $c in
([[:lower:]]) echo lowercase letter;;
([[:upper:]]) echo uppercase letter;;
([[:alpha:]]) echo neither lower nor uppercase letter;;
([[:digit:]]) echo decimal digit;;
(?) echo any other single character;;
("") echo nothing;;
(*) echo anything else;;
esac
(構文はPOSIXsh
構文なのでインストールする必要もありませんbash
)。
英語の文字(分音符なしのラテンアルファベット文字)に制限するには、個別に名前を付ける必要があります。
([abcdefghijklmnopqrstuvwxyz]) echo English lowercase letter;;
export LC_ALL=C
あるいは、ステートメントの前後にread
ロケールをCに変更しcase
ますが、(?)
一部の文字を文字シーケンスとして誤って解釈する可能性があるため、テストは機能しません。たとえば、UTF-8 はé
C ロケールで 2 文字として扱われます。
答え2
正規表現テストを試してください。
read -p "Type a character" c
if [[ "$c" =~ [a-z] ]]; then
echo "lowercase"
elif [[ "$c" =~ [A-Z] ]]; then
echo "uppercase"
else
echo "Non-alphabetic"
fi
答え3
変数を引用符で囲む必要があります。たとえば、正規表現を文字列としてテストする場合は、次のように入力できます。
echo "enter a US state name"
read var_1
if [[ "$var_1" =~ [A-Z] ]]; then
echo "contains a capital letter"
elif [[ "$var_1" =~ [a-z] ]]; then
echo "contains lower case letters"
else
echo "contains special characters or numbers"
fi
答え4
while read -r line; do
[[ "${line:0:1}" =~ [[:upper:]] ]] && echo "Started with upper: $line" || echo "$line";
done</path/to/file