我目前正在修改一個大的BASH腳本,它在幾個不同的發行版(主要是基於Redhat和Debian的版本)上安裝/檢查一系列軟件包。爲什麼在使用eval時awk打印完整行?
爲了解決發行版之間的一些差異(例如rpm vs dpkg,yum vs apt等),我試圖用各種命令字符串加載一些變量,以便腳本沒有充滿if debian then this, otherwise this
語句。然而,看起來awk
不喜歡被放入一個評估聲明,我不明白爲什麼。
例
# Example dpkg --list output
# ii bash 4.1-2ubuntu3 The GNU Bourne Again SHell
dpkg --list | grep 'bash'
# Outputs bash entries in dpkg.
cmd="dpkg --list | grep 'bash'"
eval $cmd
# Outputs as expected, same as above.
dpkg --list | awk '/^.i/ { print $2 }'
# Outputs as expected, a list of package names.
cmd="dpkg --list | awk '/^.i/ { print $2 }'"
eval $cmd
# Awk prints full output from dpkg for every line matching the regex.
在上面的代碼,只需grepping給定包工作正常,並如預期打印,而是試圖用awk,該print $2
出現生成包名的完整列表時被忽略,只需打印整行。
任何想法?
請參閱[BashFAQ/050](http://mywiki.wooledge.org/BashFAQ/050)。 – 2012-07-12 11:22:57