出力されないように変数文字列を正しくエスケープしてください。

出力されないように変数文字列を正しくエスケープしてください。

このシェルスクリプトがあります。

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

関連情報