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优雅、简洁、惯用,并且我相信POSIX
sh
兼容(除了不确定
案例中的开头部分)。请您评论一下@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    
  }