2013-08-23 61 views
0

得到了一个非常简单的脚本,它基本上检查条码。有两个条形码必须检查,它们在变成变量时不会感到困惑。BASH中的IF语句没有达到预期的效果

基本上第一个条码应该只包含数字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 

有什么不对?是否有更好的方法来实现这一目标?

回答

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个英文字母

+0

干杯!除非有什么作用? –

+2

我简单地加了!否定表达式 –

+0

@ Aleks-DanielJakimenko这很好。你仍然需要引用你的正则表达式。也许我会为你编辑你的帖子。 –