检查shell脚本中的数字是否为十六进制,而未指定字符数限制[bash]

时间:2018-09-12 14:47:14

标签: linux bash shell unix

我想检查shell脚本中的数字是否为十六进制。我尝试了下面的代码来检查范围0-9A-Fa-f

即,如果HEX =“ 301D” [4个字符],则下面的代码将起作用。我的目标是消除对检查中字符数的依赖。

 #!/bin/bash

    HEX="301DE8"

    #if ! [[ $HEX =~ ^[[:xdigit:]]{10}$ ]] ; then
    #if ! [[ $HEX =~ ^[0-9A-Fa-f]{10}$ ]] ; then
    #if ! [[ $HEX =~ ^[0-9A-Fa-f]$ ]] ; then
    if ! [[ $HEX =~ ^[0-9A-Fa-f]{4}$ ]] ; then
        echo "string is not hex"
    else
        echo "string contains hex digits"
    fi

我尝试通过增加限制并删除限制。但是两者都没有用。我正在考虑使用while循环来检查每个字符作为最后的选择。 有没有更好的方法来执行检查而不指定否。字符?

2 个答案:

答案 0 :(得分:5)

我不会使用正则表达式。

HEX="301DE8"
(( 16#$HEX ))

然后您通过$?检查最后一条语句的返回码。

如果它是0,则您的十六进制可以,否则,它不是十六进制编号。

答案 1 :(得分:2)

您可以使用{1,}指定字符串的长度至少为1个字符:

HEX="301DE8"

if ! [[ $HEX =~ ^[0-9A-Fa-f]{1,}$ ]] ; then
    echo "string is not hex"
else
    echo "string contains hex digits"
fi

这将匹配任何包含至少一个指定字符(0-9A-Fa-f)的字符串

编辑:尽管肯特的解决方案更加优雅:)