next up previous
Next: 要怎樣才能避免在記憶體中留下 zombie processes? Up: 中級的問題 Previous: 我要怎樣經由 rsh 執行遠方指令時,檢查遠方指令的結束狀態?

能不能把 shell 變數傳進 awk 程式當中呢?

這個問題有兩個可行的方法,第一個方法只是把程式當中需要用到此變數的 地方直接展開,例如要得知您目前使用哪些 tty,可以使用:

        who | awk '/^'"$USER"'/ { print $2 }'                           (1)
awk 程式的程式通常會用單引號括起來,因為 awk 程式裡面經常會用到 $ 字元,如果使用雙引號的話,shell 本身會解釋這個字元。所以啦,在這種 特殊情形下,我們想要 shell 解釋 $USER 當中的 $ 字元時,就必需先用 單引號把前半段的句子暫時括起來,然後用雙引號把 $USER 括起來,再用 單引號把隨後的句子括起來。請注意,雙引號在某些狀況下可以略去不寫, 也就是說,可以寫成:
        who | awk '/^'$USER'/ { print $2 }'                             (2)
然而,如果 shell 變數的內容含有特殊字元或空白字元時,就不適用了。

第二種把變數的設定傳進 awk 的方式是利用 awk 當中一個無文件說明的 功能,它允許您從命令列透過「假造的檔案名稱」來設定變數,例如:

        who | awk '$1 == user { print $2 }' user="$USER" -              (3)
由於命令行中的變數設定是在 awk 真正處理到的時候才會生效,因此您可 以利用這種技巧讓 awk 在遇到不同檔名的時候做不同的動作。例如:

        awk '{ program that depends on s }' s=1 file1 s=0 file2         (4)

請注意有些 awk 的版本會在 BEGIN 區塊執行之前,就讓真實檔案名稱之 前所敘述的變數設定生效,但有些不會,所以您不可以依賴其中一種。

再進一步提醒,當您指定變數的設定時,如果沒有指定真實的檔案名稱, awk 將不會自動從標準輸入讀取,所以您要在命令之後加上一個 - 參數, 就跟 (3) 的指令行內容一樣。

第三種做法是使用較新版的awk (nawk),您可以在 nawk 當中直接取用環 境變數。例如:

        nawk 'END { print "Your path variable is " ENVIRON["PATH"] }' /dev/null



Tan Koan-Sin
1999-03-02