Я хочу проверить, является ли число в сценарии оболочки шестнадцатеричным. Я пробовал приведенный ниже код, в котором он проверяет диапазон 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 для проверки каждого символа в качестве последнего варианта. Есть ли лучший способ провести проверку без указания номера? персонажей?
@ Бенджамин В. Да. Но я попробовал вариант ниже, но он все равно не сработал. если ! [[$ HEX = ~ ^ [[0-9A-Fa-f]] + $]]; тогда
Это либо [0-9A-Fa-f]
, либо [[:xdigit:]]
(обратите внимание на номер [ ]
).
@benjamin W, извини. Виноват. [[$ HEX = ~ ^ [0-9A-Fa-f] + $]] мне подходит. Спасибо.
Между прочим, [[:xdigit:]]
- более безопасный выбор, поскольку не во всех региональных стандартах A-F расширяется до ABCDEF.
Вы можете указать, что строка содержит не менее 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
)
edit: Хотя решение Кента здесь намного элегантнее :)
Я не буду делать этого с регулярным выражением.
HEX = "301DE8"
(( 16#$HEX ))
затем вы проверяете код возврата последнего оператора $?
.
Если это 0
, ваш HEX в порядке, в противном случае это не шестнадцатеричный номер.
Это неверно говорит, что HEX='F+!P4_'
шестнадцатеричный, он неверно говорит, что HEX=0
не является, и он допускает выполнение произвольного кода с HEX='1-a[$(ls>&2)]'
@thatotherguy двойные кавычки?
Вы хотите проверить, содержит ли строка только шестнадцатеричные цифры, независимо от их количества? Вы ищете регулярное выражение
^[[:xdigit:]]+$
(один или несколько из[[:xdigit:]]
)?