Regex BASH:有没有一种简单的方法来检查字符串是否是有效的SHA-1(或MD5)散列?
都在标题里Regex BASH:有没有一种简单的方法来检查字符串是否是有效的SHA-1(或MD5)散列?,regex,bash,Regex,Bash,都在标题里 解决此问题的另一种方法是:在BASH中,检查字符串是否是范围[0-9]和[a-f]中的40(或32)个字符的序列的简明方法是什么?针对32个字符尝试以下方法: if [[ $SOME_MD5 =~ ^[a-f0-9]{32}$ ]] then echo "Match" else echo "No match" fi 然后,测试${stringZ}是否等于expr“$stringZ”:“[0-9a-fA-F]\{32\}\\\[0-9a-fA-F]\{40\}”,如果
解决此问题的另一种方法是:在BASH中,检查字符串是否是范围
[0-9]
和[a-f]
中的40(或32)个字符的序列的简明方法是什么?针对32个字符尝试以下方法:
if [[ $SOME_MD5 =~ ^[a-f0-9]{32}$ ]]
then
echo "Match"
else
echo "No match"
fi
然后,测试${stringZ}
是否等于expr“$stringZ”:“[0-9a-fA-F]\{32\}\\\[0-9a-fA-F]\{40\}”
,如果字符串是32或40个字符,并且只有十六进制数字,则应为真
像这样:
#!/bin/bash
stringZ=""
while [ "$stringZ" != "q" ]; do
echo "Enter a 32 or 40 digit hexadecimal ('q' to quit): "
read stringZ
if [ "$stringZ" != "q" ]; then
if [ -n $stringZ ] && [ `expr "$stringZ" : '[0-9a-fA-F]\{32\}\|[0-9a-fA-F]\{40\}'` -eq ${#stringZ} ]; then
echo "GOOD HASH"
else
echo "BAD HASH"
fi
fi
done
输出:
[ 07:45 jon@host ~ ]$ ./hexTest.sh
Enter a 32 or 40 digit hexadecimal ('q' to quit):
1234567890abcdef1234567890abcdef
GOOD HASH
Enter a 32 or 40 digit hexadecimal ('q' to quit):
1234567890abcdef1234567890abcdef01234567
GOOD HASH
Enter a 32 or 40 digit hexadecimal ('q' to quit):
1234567890abcdef1234567890abcdef0
BAD HASH
Enter a 32 or 40 digit hexadecimal ('q' to quit):
123
BAD HASH
Enter a 32 or 40 digit hexadecimal ('q' to quit):
abcdef
BAD HASH
Enter a 32 or 40 digit hexadecimal ('q' to quit):
0123456789ABCDEF0123456789aBcDeF98765432
GOOD HASH
Enter a 32 or 40 digit hexadecimal ('q' to quit):
q
[ 07:46 jon@host ~ ]$
具有以下功能:
is_valid() {
case $1 in
( *[!0-9A-Fa-f]* | "" ) return 1 ;;
( * )
case ${#1} in
( 32 | 40 ) return 0 ;;
( * ) return 1 ;;
esac
esac
}
如果shell支持POSIX字符类,可以使用
[![:xdigit:]
代替[!0-9A-Fa-f]
+1优雅、简洁、惯用,并且我相信POSIXsh
兼容(除了不确定案例中的开头部分)。请您评论一下@aioobe的解决方案中哪些不兼容Bourne Classic?谢谢。@Philippe,[[shell关键字和=~运算符都不是标准的。@tripleee,谢谢!开头参数是可选的,但是标准的,请参阅,大小写条件构造。一些旧的shell可能更喜欢[!0-9a-f]
而不是[^0-9a-f]
。您可能希望包含大写字母(原文如此)。这不会也匹配任何带有尾随或前导非十六进制字符的十六进制字符串吗?使用^和$进行定界应该可以处理这种情况。此测试将返回0到32个字符的字符串匹配。我认为,如果要精确检查32个字符,您需要^[a-f0-9]{32}$
。
is_valid() {
case $1 in
( *[!0-9A-Fa-f]* | "" ) return 1 ;;
( * )
case ${#1} in
( 32 | 40 ) return 0 ;;
( * ) return 1 ;;
esac
esac
}