2012-04-13 158 views
2

我讀ldd內,提取下面的代碼來自:用awk慶典

major=$(awk "\\$2==\"$module\" {print \\$1}" /proc/devices) 

我知道這是什麼一個班輪是幹什麼的,我不知道是爲什麼轉義字符其中使用了\。誰可以向我解釋?

+0

大概在原文中,'awk'腳本中的兩個等號之間沒有空格? – 2012-04-13 06:37:06

+0

是的,這是一個錯字 – 2012-04-13 06:43:39

回答

4

shell變量$module必須被插入到awk腳本,所以程序不能在單引號。這意味着,特殊的外殼任何字符必須用反斜槓保護。

如果筆者首選,代碼可能是這樣寫的:

major=$(awk -v module=$module '$2 == module { print $1 }' /proc/devices) 

測試原始代碼(在修復= ===後,由於雙反斜槓而出現錯誤;他們沒有必要。單個反斜槓就足夠了,如下所示:

major=$(awk "\$2==\"$module\" {print \$1}" /proc/devices) 
+1

+1但爲了安全起見,'-v module =「$ module」' – 2012-04-13 13:09:37

+0

同意,但我斷定模塊名不可能包含shell元字符。 – 2012-04-13 15:33:21

0

該命令行的作者應該使用單引號(')而不是雙引號(「)。如果不這樣做,他需要引用Shell特殊字符,以便它們可以傳遞給awk-command。

+0

這是故事的一部分;另一部分是必須將shell變量'$ module'添加到腳本中,這就是爲什麼不使用單引號的原因。 – 2012-04-13 06:47:02

+0

有更好的方法可以做到這一點 - 或者使用選項* -v *,正如您在答案中指出的那樣,或者只是在單引號腳本中編寫'「'」$ module「'」'。 – ktf 2012-04-13 07:40:57