帮酷LOGO
  • 显示原文与译文双语对照的内容


问题:

我需要检查一个特定的软件包是否从Bash脚本中安装在一个机器上。

我发现了类似的东西但我不知道如何正确使用它。

dpkg -l | grep"ansible" | awk '{print $2}'
if [$? -eq 0]; then
 echo OK
else
 echo FAIL
fi

我需要检查,如果命令 dpkg -l | grep"ansible" | awk '{print $2}' 返回 me"ansible",然后回显,否则回显失败。

@EDIT

我觉得最好是命令

dpkg -l | grep"ansible" | awk '{print $2}'

所以这个命令给了我两个词:

ansible
ansible_lint

我应该如何使用这个bash脚本? 如果我做这样的事情:

ansible = $?
if [$? -eq 0]; then
 echo OK
else
 echo FAIL
fi

我觉得这不正常但我肯定是错误的。 如果 get"ansible"grep grep命令,那么如果没有打印失败,那么 dpkg -l"ansible"| awk命令 and 。


回答 1:

你可以检查这里软件是否以这种方式安装:

if ["$(dpkg -l | awk '/ansible/{print }'|wc -l)" -ge 1 ]; then
 echo OK
else
 echo FAIL
fi

你不能使用退出代码,因为它将来自 awk,并且总是为 0


回答 2:

如果你知道确切的软件包名称,你可以询问 dpkg 是否已经安装

dpkg -l packagename

例如:

$ dpkg -l pulsea
dpkg-query: no packages found matching pulsea

如果没有安装包,退出代码也是 1 ( 失败),你可以测试该( 如后所见) 。

$ dpkg -l pulseaudio
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/Name Version Architecture Description
+++-==================-==============-==============-=========================
ii pulseaudio 10.0-1+deb9u1 i386 PulseAudio sound server

这里的退出代码是 0 ( 成功),所以你也可以这样做

$ if dpkg -l pulseaudio; then echo yes;fi
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/Name Version Architecture Description
+++-==================-==============-==============-=========================
ii pulseaudio 10.0-1+deb9u1 i386 PulseAudio sound server
yes

注意上面的"是"。 但现在,既然你可以以使用出口代码,那么你不会真正关心它的输出,因这里忽略 if 或者 && ( 和列表) 。

$ if dpkg -l pulseaudio>/dev/null; then echo yes;fi
yes
$ dpkg -l pulseaudio>/dev/null && echo yes
yes

dpkg也可以匹配部分名称,使用星号,就像

$ dpkg -l"*pulse*"

如果你想了解管道中某个命令是否失败,则必须执行类似于检查该命令的操作:

$ false | true
$ echo ${PIPESTATUS[@]} 
1 0

$? 一样,${PIPESTATUS[@]} 随每个命令改变,所以如果你想多次检查它们,你必须先将它们保存到另一个变量。 在你的示例中

ansible = $?
if [$? -eq 0]; then

$? 已经经被that测试所改变,可以能是 0,因为分配一个变量几乎总是成功。





Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语