Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在shell脚本中检查数字是否为十六进制,但不指定字符数限制[bash]_Linux_Bash_Shell_Unix - Fatal编程技术网

Linux 在shell脚本中检查数字是否为十六进制,但不指定字符数限制[bash]

Linux 在shell脚本中检查数字是否为十六进制,但不指定字符数限制[bash],linux,bash,shell,unix,Linux,Bash,Shell,Unix,我想检查一个数字在shell脚本中是否为十六进制。我尝试了下面的代码,它检查范围0-9A-Fa-f i、 e,如果HEX=“301D”[4个字符],则以下代码将起作用。我的目标是消除对检查中字符数的依赖 #!/bin/bash HEX="301DE8" #if ! [[ $HEX =~ ^[[:xdigit:]]{10}$ ]] ; then #if ! [[ $HEX =~ ^[0-9A-Fa-f]{10}$ ]] ; then #if ! [[ $HEX

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

i、 e,如果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循环来检查每个字符,作为最后一个选项。
是否有更好的方法在不指定字符数的情况下执行检查?

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

HEX="301DE8"

if ! [[ $HEX =~ ^[0-9A-Fa-f]{1,}$ ]] ; then
    echo "string is not hex"
else
    echo "string contains hex digits"
fi
这将匹配至少由1个指定字符组成的任何字符串(
0-9A-Fa-f


编辑:尽管Kent在这里的解决方案要优雅得多:)

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

HEX="301DE8"

if ! [[ $HEX =~ ^[0-9A-Fa-f]{1,}$ ]] ; then
    echo "string is not hex"
else
    echo "string contains hex digits"
fi
这将匹配至少由1个指定字符组成的任何字符串(
0-9A-Fa-f


编辑:虽然肯特的解决方案在这里要优雅得多:)

但我不会用正则表达式

HEX="301DE8"
(( 16#$HEX ))
然后通过
$?
检查最后一条语句的返回代码


如果它是
0
,那么十六进制就可以了,否则它就不是十六进制数。

我不会用正则表达式

HEX="301DE8"
(( 16#$HEX ))
然后通过
$?
检查最后一条语句的返回代码


如果它是
0
,则十六进制是正常的,否则它不是十六进制数。

是否要检查字符串是否只包含十六进制数字,无论有多少?你在找正则表达式吗?@Benjamin W,是的。但我尝试了下面的选项,但仍然不起作用。如果![[$HEX=~^[[0-9A-Fa-f]]+$];然后是
[0-9A-Fa-f]
[:xdigit:]
(注意
[]
的编号)。@benjamin W,对不起。我的错误。[$HEX=~^[0-9A-Fa-f]+$]]对我来说很好。谢谢。
[:xdigit:][]
是更安全的选择,顺便说一句,因为不是每个语言环境都有A-F扩展到ABCDEF。是否要检查字符串是否只包含十六进制数字,不管有多少?你在找正则表达式吗?@Benjamin W,是的。但我尝试了下面的选项,但仍然不起作用。如果![[$HEX=~^[[0-9A-Fa-f]]+$];然后是
[0-9A-Fa-f]
[:xdigit:]
(注意
[]
的编号)。@benjamin W,对不起。我的错误。[$HEX=~^[0-9A-Fa-f]+$]]对我来说很好。谢谢。
[:xdigit:][]
是更安全的选择,顺便说一句,因为不是每个语言环境都有A-F扩展到ABCDEF。这不正确地说
HEX='F+!P4
是十六进制,它错误地说
hex=0
不是,并且它允许使用
hex='1-a[$(ls>&2)]执行任意代码。
@thatotherguy双重引用它?这错误地说
hex='F+!P4是十六进制,它错误地说,
hex=0
不是,并且它允许使用
hex='1-a[$(ls>&2)]执行任意代码。
@thatotherguy双引号引用它?