我正在研究一个bash shell脚本,该脚本测试一个字符串并为以下内容返回true:
1)至少8个字符
2)至少有一个字母和一个数字
3)同时具有小写字母和大写字母
通过搜索,我确实找到了如何获取字符串中的字符数
srtLen=$(echo -m $str | wc -m)
而if语句将
if [ $strLen -ge 8 ]; then
#make bool var true
fi
但是我无法找到如何测试和返回布尔值的方式,例如字符串是否包含小写字母,大写字母和至少一个数字。我不在乎每个测试是否分开,我想它们会在if语句中分开,这就是为什么我在代码中提到了将根据条件设置的布尔变量上方的原因。
答案 0 :(得分:1)
这是英语字母,如果您需要其他字母,则需要弄乱语言环境和变量Runtime Error
Uncaught (in promise): navigation stack needs at least one root page
Stack
Error: Uncaught (in promise): navigation stack needs at least one root page
at c (http://192.168.43.214:8100/build/polyfills.js:3:19752)
at Object.reject (http://192.168.43.214:8100/build/polyfills.js:3:19174)
at NavControllerBase._fireError (http://192.168.43.214:8100/build/vendor.js:53087:16)
at NavControllerBase._failed (http://192.168.43.214:8100/build/vendor.js:53080:14)
at http://192.168.43.214:8100/build/vendor.js:53127:59
at t.invoke (http://192.168.43.214:8100/build/polyfills.js:3:14976)
at Object.onInvoke (http://192.168.43.214:8100/build/vendor.js:5134:33)
at t.invoke (http://192.168.43.214:8100/build/polyfills.js:3:14916)
at r.run (http://192.168.43.214:8100/build/polyfills.js:3:10143)
at http://192.168.43.214:8100/build/polyfills.js:3:20242
:
LC_COLLATE
试运行:
check_str()
{
str="$1"
# Has a minimum of 8 characters
if (( ${#str} > 7 )) &&
# Has at least one number
[[ "$str" = *[0-9]* ]] &&
# Has both a lowercase
[[ "$str" = *[a-z]* ]] &&
# and uppercase letter
[[ "$str" = *[A-Z]* ]]
then
return 0
else
return 1
fi
}
while :
do
read -p "Enter a string: " inp
if check_str "$inp"
then
echo "$str matches"
else
echo "$str does not match"
fi
done
请注意,您的条件2和3重叠,对于2,我们只需要检查是否有数字,则在3中检查是否存在字母。
答案 1 :(得分:1)
这是一个通用答案,适用于非英语语言环境和多字节UTF-8字符。
让我们将您的每个要求翻译成bash
代码:
$str
(至少8个字符):可以使用bash内置函数以几种简单的方式完成
[ "${#str}" -ge 8 ] && echo "str has a minimum of 8 characters"
简单明了:我们比较$str
[[ "$str" == ????????* ]] && echo "str has a minimum of 8 characters"
$str
已根据至少匹配8个字符的模式进行检查
[[ "$str" =~ .{8} ]] && echo "str has a minimum of 8 characters"
$str
[ -n "${str#???????}" ] && echo "str has a minimum of 8 characters"
删除前7个字符后,我们检查$str
是否为空(不明显,应避免)
具有至少一位数字:
[[ "$str" == *[[:digit:]]* ]] && echo "str has at least one digit"
$str
是根据与任意数量的字符包围的数字匹配的模式进行检查的
[[ "$str" =~ [[:digit:]] ]] && echo "str has at least one digit"
$str
根据与一位数字匹配的正则表达式进行检查
[ -n "${str//[^[:digit:]]}" ] && echo "str has at least one digit"
当所有非数字字符都被删除时,我们检查$str
是否为空(不明显,应避免)
至少有一个小写字母:
与数字相同,只需将[[:digit:]]
替换为[[:lower:]]
[[ "$str" == *[[:lower:]]* ]] && echo "str has at least one lowercase letter"
[[ "$str" =~ [[:lower:]] ]] && echo "str has at least one lowercase letter"
[ -n "${str//[^[:lower:]]}" ] && echo "str has at least one lowercase letter"
至少有一个大写字母:
与数字相同,只需将[[:digit:]]
替换为[[:upper:]]
[[ "$str" == *[[:upper:]]* ]] && echo "str has at least one uppercase letter"
[[ "$str" =~ [[:upper:]] ]] && echo "str has at least one uppercase letter"
[ -n "${str//[^[:upper:]]}" ] && echo "str has at least one uppercase letter"
您当然可以结合以下四个条件:
$ str='my ßtrÎñ9'
$ if [[ "${#str}" -ge 8 \
&& "$str" =~ [[:digit:]] \
&& "$str" =~ [[:lower:]] \
&& "$str" =~ [[:upper:]] \
]]; then
echo "str is a valid password"
else
echo "str is NOT a valid password"
fi
str is a valid password