正确转义该变量字符串,使其不输出

正确转义该变量字符串,使其不输出

我有这个 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

相关内容