2011-08-15 34 views
1

我在我的bash腳本,工作不穩定代碼:不穩定的bash聲明

# check every line of check_list file presents in my_prog output 
MY_LIST=`./my_prog` 
for l in $(cat check_list); do 
    if ! echo -n "$MY_LIST" | grep -q -x "$l"; then 
     die "Bad line: '$l'" 
    fi 
done 

這一塊我巨大的腳本庫的代碼顯示「壞行:‘smthng’」周圍1/5000的概率。我無法用裸體腳本代表這一事件,只能在我龐大的腳本庫中表現出來。

但是這個代碼看起來做工非常精細:

# check every line of check_list file presents in my_prog output 
./my_prog > my_list 
for l in $(cat check_list); do 
    if ! grep -q -x "$l" "my_list"; then 
     die "Bad line: '$l'" 
    fi 
done 

爲什麼我不喜歡第二條語句的原因是,它使用中間文件「my_list」。 什麼可能是第一個陳述不穩定的問題?

回答

2

而不是調用的grep在你的check_list每一行的,你可以運行一個awk程序:

awk ' 
    FILENAME == ARGV[1] {check_list[$0]; next} 
    $0 in check_list { 
    print "bad line: " $0 
    exit 1 
    } 
' check_list <(./my_prog) 

或者,看看是否有你的程序的輸出和你check_list之間的任何公共線:

common=$(comm -12 <(sort -u check_list) <(./my_prog | sort -u)) 
if [ -n "$common" ]; then 
    echo "bad lines: " 
    echo "$common" 
    die 
fi 
+0

comm完美,謝謝!對我的情況的一個評論我使用「comm -23」 – Soid

1

我不知道第一個版本有什麼問題,但是您可以輕鬆地刪除臨時文件的創建。 請注意,您必須更正邏輯,我並不真正瞭解這一點,可能您需要更新內部循環中的變量並決定是否在內部循環後死亡。

for i in $*; do 
    for l in $(cat check_list); do 
    if ! echo "$i" | grep -q -x "$l"; then 
     die "Bad line: '$i', '$l'" 
    fi 
    done 
done | ./my_prog