BASH的IF声明没有达到预期的效果

Ell*_*eed 0 regex unix linux bash if-statement

有一个非常简单的脚本,基本上检查条形码.必须检查两个条形码,使它们在变成变量时不会混淆.

基本上第一个条形码应仅包含数字0-9,第二个条形码应包含两个字母,然后是一些数字,然后是两个字母,如AB123456789CD.

如果他们感到困惑并以错误的顺序阅读,那么它会播放错误的声音.这是我到目前为止,最顶层的工作,但我不确定它是最好的解决方案,而最底层的解决方案并不是我想要的:

echo -e $BLUE"Please scan the first barcode"$ENDCOLOUR
read -p "Barcode: " BARCODE1
if [[ "$BARCODE1" =~ [a-z] ]] ; then
play -q ./error.wav
else

echo -e $BLUE"Please scan the second barcode"$ENDCOLOUR
read -p "Barcode: " BARCODE1
if [[ "$BARCODE2" =~ [a-z0-9] ]] ; then
play -q ./error.wav
else

echo "'$BARCODE1',$BARCODE2'" >> barcodes.csv
fi
fi
Run Code Online (Sandbox Code Playgroud)

怎么了?是否有更好的方法来实现这一目标?

Ale*_*-A. 7

只有数字:

if ! [[ $BARCODE1 =~ ^[0-9]+$ ]]; then
Run Code Online (Sandbox Code Playgroud)

由于这个+符号,这也将输入空字符串的if语句.+表示一次或多次,*表示零次或多次.

两个字符,数字,两个字符:

if ! [[ $BARCODE1 =~ ^[a-zA-Z][a-zA-Z][0-9]+[a-zA-Z][a-zA-Z]$ ]]; then
Run Code Online (Sandbox Code Playgroud)

再一次,这不符合像'AABB'这样的字符串.如果您认为'AABB'是有效的条形码,请使用此:

if ! [[ $BARCODE1 =~ ^[a-zA-Z][a-zA-Z][0-9]*[a-zA-Z][a-zA-Z]$ ]]; then
Run Code Online (Sandbox Code Playgroud)

编辑:

此外,如果您知道条形码中的确切数字,那么您可以使用 {n}

if ! [[ $BARCODE1 =~ ^[a-zA-Z]{2}[0-9]{9}[a-zA-Z]{2}$ ]]; then
Run Code Online (Sandbox Code Playgroud)

这意味着2个字母,9个数字,2个字母

  • @ ChrisJester-Young:BASH的正则表达式没有引用.我回滚了你的更改. (4认同)
  • 我简单地补充说!否定表达 (2认同)