检查是否已安装某些程序的脚本


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. Ben Knoble

1
您是否要区分软件包名称和可执行文件名?还是想同时检查两者?当前只有George的答案会检查可执行文件
Xen2050

为什么要检查?该脚本的用途是什么?
Braiam '18

@Braiam至少使用apt,如果已安装的软件包仅作为另一个软件包的依赖项安装,则安装后将其状态从自动更改为手动。如果以后删除了该其他程序包,则该程序包将不再标记为自动删除。我有一个脚本可以将以前安装的已编辑软件包列表安装到新软件包中。这项技术可以防止新系统混乱。

@Joe这是一个不好的解决方案。相反,您应该只获得已安装软件包的列表,apt-mark showmanual然后使用进行安装apt-get install "$(< package.list)"
Braiam '18

Answers:


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?该命令需要继续执行下一行...否则,
做得

3
请注意,该软件可以通过多种方式安装,并且dpkg仅与已安装的debian软件包相关。在OP的特定情况下,youtube-dl例如可以通过也Python的包管理器安装pip
谢尔盖Kolodyazhnyy

2
为什么不if dpkg -s “$name” &> /dev/null ; then呢?效果相同,更干净的imo。
D. Ben Knoble

的确,检查退出状态是什么if
赞纳

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现场回答,那将是另一回事!
乔治·乌德森

3

您为什么首先要检查它?除非您有充分的理由,否则就不要这样做apt-get install package。如果已经安装,它将在有可用的更新版本时进行更新;如果已安装并且是最新的,则什么也不会发生。如果您需要应用某些配置,则还有其他选项,例如构建依赖于该软件包的配置软件包或使用诸如ansible的配置管理软件。


1
经常会发生一些事情:至少使用apt,如果已安装的软件包仅作为另一个软件包的依赖项安装,则将其状态从自动更改为手动。如果以后删除了该其他程序包,则该程序包将不再标记为自动删除。我有一个脚本可以将以前安装的已编辑软件包列表安装到新软件包中。这项技术可以防止新系统混乱。

2

一种使用apt-mark以下方法检查已安装软件包的简便方法:

apt-mark showinstall将列出所有标记为install(已安装或排队等待安装)的软件包。之后,只需将您关心的程序包grep即可。

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


您在正确的轨道上!只需将其更改为消除误报即可:apt-mark showinstall | grep -q“ ^ $ PACKAGE_NAME $” && echo“已安装” || 回声“不是”
埃里克·明茨

@EricMintz-感谢您的改进!编辑。
user535733 '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.