我想检查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循环来检查每个字符作为最后的选择。 有没有更好的方法来执行检查而不指定否。字符?
答案 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
)的字符串
编辑:尽管肯特的解决方案更加优雅:)