在bash脚本中搜索功能以检测已安装的软件包

时间:2013-11-18 18:37:22

标签: linux bash debian fedora redhat

如果安装了软件包列表,我需要一些代码来检查。这个检查应该适用于每个Linux发行版(Fedora,Arch-Linux,Debian,RedHat,...)。

实际上我的剧本看起来像那样:

    #!/bin/bash
    # At first check, if all needed softwares are installed
    declare -a NEEDED_SOFTWARE_LIST=(bash rsync wget grep telnet)

    if [ -f /etc/debian_version ]; then
            for SOFTWARE in ${NEEDED_SOFTWARE_LIST[@]}; do
                    dpkg -l | grep -i $SOFTWARE | head -1 | if [[ "$(cut -d ' ' -f 1)" != "ii" ]]; then
                                    echo -e "$SOFTWARE is NOT installed completely! Please install it...\n";
                                    exit 1;
                            fi
            done
    else
            echo "No Debian";
    fi

我希望有人可以帮助我。

2 个答案:

答案 0 :(得分:1)

当你说:

  

此检查应适用于每个Linux发行版(Fedora,Arch-Linux,Debian,RedHat,...)。

你快要死了......

没有简单的方法可以对所有发行版充满信心。

通过这种方法,你会发现:

  • 没有可靠的方法来猜测发行版,它甚至取决于版本......
  • 没有可靠的方法说“这个软件包不在系统中”,你只会假设如果它没有使用该发行版的官方软件包管理器安装,它就不会在那里。
  • 有时,人们使用的不仅仅是一个包管理器。
  • 没有可靠的方法来知道你所说的包是否在该发行版中具有该名称(例如 - php可以在一个发行版中为“php”,在另一个发行版中为“php5”,并且两者都是是“php5”)
  • 这将成为一个难以维护,容易失败,永不可靠的软件。

因此,如果您需要创建一个安装程序并具有依赖关系,请使用一个众所周知的包管理器,构建一个好的包,并且不要重新发明轮子。

这可能听起来令人生畏,但从长远来看它会得到回报。

答案 1 :(得分:0)

检查二进制文件是否找不到更简单?

declare -a NEEDED_SOFTWARE_LIST=(bash rsync wget grep telnet)
for SOFTWARE in ${NEEDED_SOFTWARE_LIST[@]} ; do
  $SOFTWARE --version |& grep "command not found" && echo "$SOFTWARE is NOT installed completely! Please install it..." && exit 1
done