「Linux基礎(chǔ)」awk中單雙引號的區(qū)別

在服務(wù)器共享群里有個朋友貼了下面這張圖并艾特了我問: 萌老師, 為啥awk在使用單雙引號時結(jié)果會不一樣呢?
在這張圖里, 當(dāng)awk的最外層使用雙引號時, 命令沒有任何的返回結(jié)果, 但當(dāng)把雙引號替換成單引號的時候, 就能正常返回結(jié)果了. 這是怎么回事呢?

單雙引號為啥不一樣呢

之前我在給生信技能樹的生信入門12期學(xué)員講課時沒有給大家展開仔細(xì)講這個單雙引號的區(qū)別, 只在最后一節(jié)課講自定義變量的時候提了一下:

當(dāng)我定義一個$a為gene時, 用單引號和雙引號擴(kuò)起來分別echo出來, 會發(fā)現(xiàn)單引號里$a就是本體, 而雙引號里的$a則會被解釋(擴(kuò)展)為對應(yīng)的變量內(nèi)容.

舉個例子

當(dāng)時給出的解釋是:

單引號:變量不會被解釋
雙引號:變量被解釋

在awk的部分沒有具體講是因為這事兒太細(xì)致了, 只要當(dāng)作這是一種“固定用法”, 養(yǎng)成習(xí)慣最外層用單引號內(nèi)層用雙引號就完事兒了, 就能避免絕大多數(shù)情況下的錯誤.


那既然現(xiàn)在有人提問了, 那就再解釋一下.
在中文世界里找了一圈, 不太有合適的解釋帖子. 于是就到英文世界里去搜了一圈, 找到下面兩個鏈接:

  1. Why does using double quotes to enclose awk's action statements produce different results than when using single quotes to enclose them?
  2. Shell Quoting Issues

第一個是個問詢貼, 第二個是GNU官方的gawk的官方手冊.

要說區(qū)別的話就是shell和awk對單雙引號的處理是不一樣的.
在第一個鏈接的問詢貼里有這么一句:

If you use double quotes the $2 gets replaced by the shell before awk is called.

這句話意思就是, 如果你用雙引號, shell會在awk處理之前就把$2給展開了, 那么awk識別的時候就出錯了, 就得不到你要的結(jié)果了. 為了避免這種shell把a(bǔ)wk活兒給提前搶了的問題, 最外層用單引號就好了.

回到最前面的截圖, 在①中, 因為用了雙引號, awk后面的$0先被shell解釋了(一般專業(yè)詞匯應(yīng)該叫展開, extend). 這時候$0不再是awk里的“所有字段”(代表整個文本行)的含義, 而是一個叫做“$0”的變量(就跟前面舉例的$a一樣). 這就是為啥最后awk回沒有結(jié)果的原因.

在②中, 因為使用的單引號, $0不會被shell展開, 其含義仍是awk內(nèi)的含義.

如果大家對awk比較感興趣的話, 有一些awk編程相關(guān)的書籍可以查詢的.
例如介紹sed和awk的書: 《sed與awk》或者是《awk programming》

sed與awk

awk programming

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容