我正在读一个角色,想要检查这是否是单个字符并且是一个字母。我的代码如下:
#!/usr/bin/bash
read -p "Enter something: " char
if [[ ${#char} != 1 && "$char" != *[a-z]* ]]; then
echo "Not a valid input"
else
echo "Its a valid input"
fi
o / p如下:
[root@host-7 ~]# sh -x t
+ read -p 'Enter something: ' char
Enter something: 1
+ [[ 1 != 1 ]]
+ echo 'Its a valid input'
Its a valid input
执行脚本时,只有第一个条件被执行而它没有检查第二个条件。
答案 0 :(得分:1)
它没有评估第二个条件,因为第一个条件失败,因为您在输入中只输入了一个字符,并且在两个条件之间存在&&
。
如果您输入ab
之类的2个字符输入,那么您将看到两个条件都得到评估。
您可以使用-n1
限制输入到一个字符,如下所示:
#!/usr/bin/bash
read -n1 -p "Enter something: " char
echo
if [[ "$char" != *[a-z]* ]];then
echo "Not a valid input"
else
echo "Its a valid input"
fi
并按以下方式运行:
bash -x ./t
答案 1 :(得分:1)
如果您希望测试单个字母,可以使用POSIX字符类[[:alpha:]]
或等效[a-zA-Z]
。无需检查长度或使用通配符作为单个bash模式,只会在使用extglob
可选patterns时测试多次匹配。
read -p "Enter something: " char
if [[ $char != [[:alpha:]] ]]; then
echo "Not a valid input"
else
echo "It's a valid input"
fi
答案 2 :(得分:0)
您只需将if
语句更改为:
if [[ $char != [a-zA-Z] ]]; then
它将检查$char
是否是单个字符并且是一个字母(a-z,A-Z)。
示例:
#!/bin/bash
read -p "Enter something: " char
if [[ $char != [a-zA-Z] ]]; then
echo "Not a valid input"
else
echo "Its a valid input"
fi
输出将如下:
ab : inavlid
a : valid
1 : invalid
12 : invalid
A : valid
AB : invalid