2016-08-03 269 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