2010-08-20 42 views
3

在下面的代碼中,我試圖將shell varibale傳遞給awk。但是,當我嘗試運行它爲a.sh foo_bar時,打印的輸出爲「foo未聲明」,當我將其作爲a.sh bar_bar運行時,打印的輸出爲「foo已聲明」。 awk中是否有bug或者我在這裏做錯了什麼?在awk中錯誤地解釋shell變量

我正在使用gawk-3.0.3。

#!/bin/awk 

model=$1 

awk ' { 

     match("'$model'", /foo/) 
     ismodel=substr("'$model'", RSTART, RLENGTH) 
     if ( ismodel != foo) { 
     print " foo is not declared" 
     } else { 
     print " foo is declared" 
     } 
    } 
    ' dummy 

dummy是單個空行的文件。

感謝,

回答

1

這不是一個錯誤,而是代碼中的錯誤。該問題的行是:

if ( ismodel != foo) { 

這裏foo應該"foo"。現在你正在比較一個空變量。當你有一場比賽時,這會讓你失望,當你沒有比賽時,這是真的。所以問題不在於你使用shell變量的方式。

但正如其他答覆者所說的,將參數傳遞給awk的首選方法是使用-v開關。當你決定把你的awk腳本放在一個單獨的文件中並防止所有類型的引用問題時,這也會起作用。

我也不確定您是否使用了虛擬文件。這僅僅是爲了這個例子嗎?否則,您應該省略該文件並將所有代碼放在BEGIN {}塊中。

+0

謝謝schot!它的工作原理就像你說的那樣。 – 2010-08-20 07:32:25

0

使用-v選項變量傳遞從外殼

awk -v model="$1" '{ 
    match(model, /foo/) 
    ..... 
} 
' dummy 
2

您應該使用AWK的變量傳遞,而不是複雜的引用:

awk -v awkvar=$shellvar 'BEGIN {print awkvar}' 

你的腳本編寫作爲shell腳本,但是你有一個AWK shebang行。您可以將其更改爲#!/bin/sh

+0

我粘貼代碼的錯誤(#!/ bin/awk)。如果我使用-v選項傳遞變量,則可以解決此問題。但問題仍然相同,爲什麼awk檢查比較的方式是相反的?如果-v是傳遞shell變量的唯一選項,那麼awk不應該總是打印「foo沒有聲明」。 – 2010-08-20 07:08:52