我有这个 shell 脚本:
UNZIP_FOUND=$(dpkg-query -W --showformat='${Status}\n' unzip|grep "install ok installed")
if [ "" == "$UNZIP_FOUND" ]; then
echo unzip not found, I will install it
apt-get --assume-yes install unzip > /dev/null
fi
然而,这每次都会产生一个句子:
dpkg-query: no packages found matching unzip
在运行实际安装步骤之前。
有办法摆脱它吗?
我只需在其中分配 dkpg-query 命令的值UNZIP_FOUND变量,但我不想回显它。
我读到执行此操作的方法是用 ' 引号将变量赋值引起来,我尝试像这样转义字符串:
UNZIP_FOUND='$(dpkg-query -W --showformat=\'${Status}\n\' unzip|grep "install ok installed")'
但这不起作用,可能我的逃跑很糟糕。
答案1
你可以简单地做
apt-get --assume-yes install unzip
如果安装了它,它不会做任何事情(除非它已经过时,在这种情况下它将被升级)。
如果您希望它保持安静,请添加--quiet
该内容,或重定向到/dev/null
:
apt-get -qq --assume-yes install unzip
(-qq
“非常安静”,但请参阅apt-get
有关此标志的手册)
如果你确实想先查询包是否存在,你可以这样做
if ! dpkg-query -W unzip >/dev/null 2>&1; then
apt-get --assume-yes install unzip
fi
dpkg-query
如果找不到包,则以非零退出状态退出。我们将标准输出和标准错误重定向到,/dev/null
因为那里写的任何内容都不有趣。
您在终端上收到错误消息的原因是将dpkg-query
其写入标准错误流,而您的脚本仅捕获标准输出流。
答案2
dpkg-query -W --showformat='${Status}\n' unzip 2>/dev/null