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

时间:2013-08-23 13:46:37

标签: regex linux bash unix 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

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

1 个答案:

答案 0 :(得分:7)

只有数字:

if ! [[ $BARCODE1 =~ ^[0-9]+$ ]]; then

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

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

if ! [[ $BARCODE1 =~ ^[a-zA-Z][a-zA-Z][0-9]+[a-zA-Z][a-zA-Z]$ ]]; then

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

if ! [[ $BARCODE1 =~ ^[a-zA-Z][a-zA-Z][0-9]*[a-zA-Z][a-zA-Z]$ ]]; then

编辑:

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

if ! [[ $BARCODE1 =~ ^[a-zA-Z]{2}[0-9]{9}[a-zA-Z]{2}$ ]]; then

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