我目前正在修改一个大型 BASH 脚本,该脚本在几个不同的发行版(主要是基于 Redhat 和 Debian)中安装/检查一系列包。
为了处理发行版之间的一些差异(例如 rpm 与 dpkg、yum 与 apt 等),我尝试使用各种命令字符串加载一些变量,以使脚本中不包含if debian then this, otherwise this
语句。但是,它似乎awk
不喜欢放在 eval 语句中,我不知道为什么。
例子
# 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
似乎会被忽略并简单地打印整行。
有任何想法吗?