проверить, является ли число шестнадцатеричным в сценарии оболочки без указания ограничения количества символов [bash] - PullRequest
0 голосов
/ 12 сентября 2018

Я хочу проверить, является ли число шестнадцатеричным в сценарии оболочки. Я пробовал приведенный ниже код, где он проверяет диапазон 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 голосов
/ 12 сентября 2018

Я не буду делать это с регулярным выражением.

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

, тогда вы проверяете код возврата последнего оператора по $?.

Если это 0, вашHEX в порядке, иначе это не HEX номер.

0 голосов
/ 12 сентября 2018

Вы можете указать, что длина строки не менее 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: Хотя решение Кента здесь намного элегантнее :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...