簡體   English   中英

包裝awk代碼時使用雙引號和單引號

[英]double and single quotes in wrapping awk codes

我試圖從存儲在bash中的變量foo中的一組字符串中提取一個字符串:

foo="I foobar you"

使用awk ,但我得到了不同的結果,當我裹着awk用單引號和雙引號:

$ echo $foo | awk '{print $2}'
$ foobar

$ echo $foo | awk "{print $2}"
$ I foobar you

誰能告訴我為什么'"導致不同的結果,當包裝awk

這是因為在使用雙引號時,shell會在將其傳遞給awk之前嘗試將其擴展為位置參數或變量。 在您的情況下,它嘗試擴展$1但沒有找到任何價值,因此擴展結果為 ,這就是為什么您在awk中獲得默認的print操作來打印整行的原因。

之所以我們單引號awk命令,是因為我們想要一個純字符串,並且在由$1作為第一個字段(帶有默認空格分隔符)的Awk命令本身進行處理之前,不進行任何方式被外殼修改/篡改。

根據外殼的報價規則:

  • 單引號('')可保護左引號和右引號之間的所有內容。 外殼程序不解釋引用的文本,將其逐字傳遞給命令。

    就像在您的代碼{print $ 2}中一樣,它是作為awk傳遞給動作的:
    $ echo $foo | awk '{print $2}'
    $ foobar

  • 雙引號(“”)可以保護左引號和右引號之間的大多數內容。 Shell至少對引用的文本執行變量和命令替換。 不同的外殼可能會對雙引號文本進行其他類型的處理。 因為雙引號中的某些字符是由外殼程序處理的,所以必須在文本內對其進行轉義。 值得注意的是字符“ $”,“'',“ \\”和“”,如果要直接將它們傳遞給程序,則所有這些字符都必須在雙引號中加上反斜杠。

    因此,您必須轉義$以獲得第二個col的值,如下所示:
    $ echo $foo | awk "{print \\$2}"
    $ foobar
    否則,awk會按照您的情況執行其默認操作,即打印整行。

  • 對於引用Shell變量的最佳做法,@ Ed Mortan表示完全同意。 雖然雙引號是默認的,但是如果不小心…。
    $ echo "$foo" with double quotes
    $ I foobar you

    $ echo '$foo' with single quotes
    $ $foo

  • 請記住,引用規則是特定於Shell的。 上面的規則僅適用於POSIX投訴的Bourne樣式的shell(例如Bash,GNU Bourne-Again Shell)。 與awk,sed,grep等無關。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM