2016-08-03 265 views
0

我在下面创建了一个shell脚本,它检查文件out.txt是否包含任何带有文本“Billing_20160210”的行。我得到正则表达式部分中的错误,声明“[[:not found”。不知道我是否缺少一些东西。任何帮助,将不胜感激。使用shell脚本进行正则表达式匹配

#!/bin/bash 
bq ls test:Dataset_test > out.txt 
cat out.txt | while read LINE 
do 
    if [ LINE = *"Billing_20160210"* ]; 
    then 
    echo "Processing $LINE" 
    fi 
done 

编辑不工作:

#!/bin/bash 
bq ls geotab-bigdata-test:JS_test > out.txt 
cat out.txt | while read LINE 
do 
if [[ $LINE == *"DailyBillingTest_20160210"* ]]; 
then 
    echo "Processing $LINE" 
fi 
done 
+2

没有正则表达式只是这里glob的。用'[[​​$ LINE == *“Billing_20160210”*]]替换'[LINE = *'Billing_20160210“*]'' – anubhava

+0

这也是UUOC的情况 – anubhava

+1

'[[:not found'也意味着你不是'实际上使用bash作为你的解释器来运行这个脚本。你用'sh yourscript'来调用它吗?如果是这样,那将覆盖'#!/ bin/bash' shebang。如果使用明确的解释器进行调用,则需要“bash yourscript”而不是“sh yourscript”。 –

回答

1

不要使用shell循环,以滤除行文件行。使用grep这里过滤器:

grep 'Billing_20160210' out.txt | while read -r line ; do 
    echo "processing ${line}" 
done 

甚至没有一个临时文件:

bq ls test:Dataset_test | grep 'Billing_20160210' | while read -r line ; do 
    echo "processing ${line}" 
done 
+1

当然,移动到这个(符合POSIX的)代码讨论了这个问题,但它可能并不会伤害到*地址解释器选择,因为这是最直接的错误。 OP当然也会在其他场合编写特定于bash的代码;理解为什么不能使用'sh'来运行'bash'脚本,因此除了这个单一的即时问题之外还有其他用处。 –

+1

@CharlesDuffy:谢谢。有用。这是我第一次尝试运行一个shell脚本,所以在开始时没有得到这一点。 – user3447653

+0

@CharlesDuffy我明白你的观点。如果需要文件扩展名,它应该是'.bash' ..我也习惯'.sh',但我承认只要代码不是100%符合POSIX就是不正确的。 – hek2mgl