一部のプログラムが既にインストールされているかどうかを確認するスクリプト


11

プログラムが既にインストールされているかどうかをチェックし、インストールされていない場合はインストールするbashスクリプトを作成するにはどうすればよいですか?

ご協力いただきありがとうございます。

ここに私がこれまでに持っているコードがあります:

#/bin/bash

PS3="choose an option"

select opcion in "Installing_Youtube"  "exit"

do

    case $opcion in


        "Installing_Youtube")

            youtube-dl > /usr/bin
            if [ $? -eq 127 ] ; then
                echo "installing youtube"
                 apt-get update
                 apt-get install youtube-dl
                mkdir Videos
            else
                echo "Youtube already installed"
            fi

        ;;


        "exit")
            exit

10
上書きします/usr/binか?
D.ベンノーブル2018

1
パッケージ名と実行可能ファイル名を区別していますか?または両方を確認したいですか?現在、実行可能ファイルをチェックするのはGeorgeの回答のみ
Xen2050

どうしてチェックしたいの?このスクリプトの用途は何ですか?
Braiam 2018

@Braiam少なくともaptでは、すでにインストールされているパッケージをインストールすると、別のパッケージの依存関係としてのみインストールされている場合、そのステータスが自動から手動に変わります。その他のパッケージが後で削除された場合、このパッケージは自動削除の対象としてマークされなくなります。以前のインストールのパッケージの編集済みリストを新しいものにインストールするスクリプトがあります。この手法は、新しいシステムを台無しにしないようにします。
Joe

@Joeは悪い解決策です。代わりに、インストールされたパッケージのリストを取得して、のapt-mark showmanualようなものでインストールする必要がありますapt-get install "$(< package.list)"
Braiam 2018

回答:


11

あなたはこれを行うことができます:

dpkg -s <packagename> &> /dev/null

次に、終了ステータスを確認します。上記のコマンドの終了ステータスが、0インストールされているパッケージと等しい場合のみ

そう:

   #!/bin/bash

    echo "enter your package name"
    read name

    dpkg -s $name &> /dev/null  

    if [ $? -ne 0 ]

        then
            echo "not installed"  
            sudo apt-get update
            sudo apt-get install $name

        else
            echo    "installed"
    fi

それを除いて?との行に何が起こりましたsudo apt install $nameか?コマンドは次の行に進む必要があります...それ以外の場合は、うまくいきます...
Zanna

3
ソフトウェアはさまざまな方法でインストールでき、インストールされたdpkgdebianパッケージにのみ関連することに注意してください。OPの特定のケースではyoutube-dl、たとえば、Pythonのパッケージマネージャーを介してインストールすることもできますpip
Sergiy Kolodyazhnyy

2
なんでif dpkg -s “$name” &> /dev/null ; then?同じ効果、よりクリーンでよりクリアなimo。
D.ベンノーブル2018

確かに、終了ステータスをチェックすることですまさにif ...
Zanna

4

これが、スクリプトで使用する目的で記述した関数です。必要なパッケージがインストールされているかどうかを確認し、インストールされていない場合は、インストールするようにユーザーに求めます。パラメータとしてパッケージ名が必要です。必要なプログラムが属するパッケージの名前がわからない場合は、それを検索できます。ここで入手可能な情報

function getreq {
dpkg-query --show  "$1"
if [ "$?" = "0" ];
then
    echo "$1" found
else
    echo "$1" not found. Please approve installation.
    sudo apt-get install "$1"
    if [ "$?" = "0" ];
    then echo "$1" installed successfully.
    fi
fi
}

3

このコマンド行は、whichプログラムを使用してチェックし、0インストールされている1場合とそうでない場合に戻ります。

which apache | grep -o apache > /dev/null &&  echo 0 || echo 1

もちろん、スクリプトで次のように使用します。

which "$1" | grep -o "$1" > /dev/null &&  echo "Installed!" || echo "Not Installed!"

簡単な使用法は次のとおりです。

#!/usr/bin/env bash
set -e

function checker() { 
        which "$1" | grep -o "$1" > /dev/null &&  return 0 || return 1 
}

if checker "$1" == 0 ; then echo "Installed"; else echo "Not Installed!"; fi

いくつかのことに注意してください:

  1. インストール中に依存関係の問題に対処する必要があります
  2. インストール中のスクリプトとの相互作用を避けるために、例についてはここを参照してください。
  3. その関数からの戻り値をキャッチし、それを使用してインストールするかどうかを決定できます。

which超ポータブルではありません。私はcommand -v代わりに頻繁に使用しますが、それは探している名前のタイプ(エイリアス、関数、実行可能ファイルなど)に大きく依存します
D. Ben Knoble

Ubuntuマシン向けの質問には、移植性はありませんか?これはUnix & Linuxサイトではありません!私がUnix & Linux現場で答えていたら、それは別の問題でしょう!
ジョージウドセン2018

3

そもそもどうしてチェックしたいの?正当な理由がない限り、やめてくださいapt-get install package。すでにインストールされている場合、新しいバージョンが利用可能であれば更新されます。インストールされていて最新の場合、何も起こりません。適用する必要がある構成がある場合は、パッケージに依存する構成パッケージのビルドや、ansibleなどの構成管理ソフトウェアの使用など、他のオプションがあります。


1
何かが頻繁に発生します:少なくともaptでは、既にインストールされているパッケージをインストールすると、別のパッケージの依存関係としてのみインストールされている場合、ステータスが自動から手動に変わります。その他のパッケージが後で削除された場合、このパッケージは自動削除の対象としてマークされなくなります。以前のインストールのパッケージの編集済みリストを新しいものにインストールするスクリプトがあります。この手法は、新しいシステムを台無しにしないようにします。
Joe

2

インストールされたパッケージを確認する簡単な方法の1つapt-mark

apt-mark showinstallinstallとマークされた(すでにインストールされている、またはインストールのキューに入れられている)すべてのパッケージがリストされます。その後は、気になるパッケージをgrepするだけです。

例: apt-mark showinstall | grep -q "^$PACKAGE_NAME$" && echo "installed" || echo "not"


あなたは正しい軌道に乗っています!これを次のように変更して、誤検知を排除します。apt-mark showinstall | grep -q "^ $ PACKAGE_NAME $" && echo "インストール済み" || echo "not"
エリックミンツ

@EricMintz-改善をありがとう!編集。
user535733 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.