如何使用正则表达式检查 bash 中 0-5 之间的输入

如何使用正则表达式检查 bash 中 0-5 之间的输入

用于检查某个范围内的单个数字的正则表达式模式是什么?我正在尝试以下模式,该模式在测试时似乎有效 https://regex101.com/

模式:\b([0-5])\b

预期结果:

输入:2 输出:好的

输入:5 输出:好的

输入:6 输出:无

输入:22 输出:无

test$ ch=2
test$ [[ $ch =~ \b([0-5])\b ]] && echo "ok" || echo "no"
no
test$ ch=6
test$ [[ $ch =~ \b([0-5])\b ]] && echo "ok" || echo "no"
no
test$ ch=62
test$ [[ $ch =~ \b([0-5])\b ]] && echo "ok" || echo "no"
no
test$ ch=0
test$ [[ $ch =~ \b([0-5])\b ]] && echo "ok" || echo "no"
no
test$

我也尝试过双回:

test$ ch=2
test$ [[ $ch =~ \\b[0-5]\\b ]] && echo "ok" || echo "no"
no
test$ [[ $ch =~ \\b([0-5])\\b ]] && echo "ok" || echo "no"
no

就我而言,bash总是给出“不”。为什么它会这样?

答案1

要验证它$ch是 ASCII 数字01234或中的任意一个5,请使用:

  • 可移植(sh语法):

    case $ch in 
      ([012345]) echo OK;;
      (*) echo not OK;;
    esac
    
  • 科恩风格的替代方案:

    if [[ $ch = [012345] ]]; then
      echo OK
    then
      echo not OK
    fi
    

不是use ranges such as [0-5]for input validation as (depending on system and locale) that tends to include many other characters that happen to sort between 0 and 5 beside 012345 such as ٠١٢٣٤۰۱۲۳۴߀߁߂߃߄०१२३४০১২৩৪੦੧੨੩੪૦૧૨૩૪୦୧୨୩୪௦௧௨௩௪౦౧౨౩౪౸౹౺౻౼౽౾೦೧೨೩೪൦൧൨൩൪෦෧෨෩෪๐๑๒๓๔໐໑໒໓໔༠༡༢༣༤༪༫༬༭༳၀၁၂၃၄႐႑႒႓႔፩፪፫፬០១២៣៤៰៱៲៳៴᠐᠑᠒᠓᠔᥆᥇᥈᥉᥊᧐᧑᧒᧓᧔᧚᪀᪁᪂᪃᪄᪐᪑᪒᪓᪔᭐᭑᭒᭓᭔᮰᮱᮲᮳᮴᱀᱁᱂᱃᱄᱐᱑᱒᱓᱔⁰⁴₀₁₂₃₄⅐⅑⅒⅓⅔⅕⅖⅗⅘⅙⅛⅜⅟↉①②③④⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳⑴⑵⑶⑷⑽⑾⑿⒀⒁⒂⒃⒄⒅⒆⒇⒈⒉⒊⒋⒑⒒⒓⒔⒕⒖⒗⒘⒙⒚⒛⓪⓫⓬⓭⓮⓯⓰⓱⓲⓳⓴⓵⓶⓷⓸⓾⓿❶❷❸❹❿➀➁➂➃➉➊➋➌➍➓〇〡〢〣〤㉈㉉㉊㉋㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾㋀㋁ ㋂㋃㋉㋊㋋㍘㍙㍚㍛㍜㍢㍣㍤㍥㍦㍧㍨㍩㍪㍫㍬㍭㍮㍯㍰㏠㏡㏢㏣㏩㏪㏫㏬㏭㏮㏯㏰㏱㏲㏳ ㏴㏵㏶㏷㏸㏹㏺㏻㏼㏽ ㏾꘠꘡꘢꘣꘤꣐꣑꣒꣓꣔꤀꤁꤂꤃꤄꧐꧑꧒꧓꧔꧰꧱꧲꧳꧴꩐꩑꩒꩓꩔꯰꯱꯲꯳꯴01234

答案2

由于您的表达式会受到 bash 扩展的影响,因此会在检查正\b则表达式之前将其扩展(尝试)。而且似乎没有必要使用捕获组。bch=b4b

您可以先将表达式放入变量中,如下所示:

exp='\b[0-5]\b'
[[ $ch =~ $exp ]] 

然而,对于这样的事情,我更喜欢使用算术运算符:

[[ $ch -gt 0 && $ch -lt 6 ]]

或者

((ch>0&&ch<6))

相关内容