Shell 脚本 - 检查单个字符输入是否为大写、小写或特殊字符

Shell 脚本 - 检查单个字符输入是否为大写、小写或特殊字符

这是我写的代码。我需要一个简单的代码,使用 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(shell 之间的行为存在一些差异。例如,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

尝试使用正则表达式测试:

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

相关内容