シェルスクリプト - 入力された1文字が大文字か小文字か特殊文字かをチェックする

シェルスクリプト - 入力された1文字が大文字か小文字か特殊文字かをチェックする

これは私が書いたコードです。読み取った文字が大文字、小文字、または特殊記号であるかどうかを確認するために、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オプションを空にして追加しない限り-rread非常に特殊な方法で入力行を読み取ります

たとえば、ユーザーが を入力し" \x "、デフォルト値が の場合$IFS、にはユーザーが入力したものではなく が$c含まれます。x

また、[a-z]小文字には一致しませんが、ロケール内のaと の間にあるすべての文字に一致します (シェルによって動作が多少異なります。たとえば、の場合、多くのロケールでは、英語の A と Y の間にある文字も含まれます)。一部のロケールおよび一部のツールでは、文字のシーケンスに一致することもあります。zbash

ここでは、おそらく次のことが必要になります:

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

関連情報