首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果安装了一些软件,我如何签入bash脚本?

问如果安装了一些软件,我如何签入bash脚本?
EN

Stack Overflow用户
提问于 2013-12-28 14:02:41
回答 1查看 6.4K关注 0票数 5

我想检查一个软件的列表,如果它已经安装或没有安装。如果没有,则应该显示它,脚本应该中止/退出。如果我只执行一次脚本,输出应该如下所示:

代码语言:javascript
复制
  wget is not installed
  telnet is not installed

目前的情况如下:

代码语言:javascript
复制
  wget is not installed

再次执行脚本..。

代码语言:javascript
复制
  telnet is not installed

如果未安装当前检查的软件,当前脚本将检查已安装的软件并中止/存在。这不太好,因为您必须多次运行脚本才能识别和检查是否安装了每个软件:

代码语言:javascript
复制
  LINUX_DISTRIBUTATION=$(grep -Eo "(Debian|Ubuntu|RedHat|CentOS)" /etc/issue)

  # Debian / Ubuntu
  if [ -f /etc/debian_version ] || [ "$LINUX_DISTRIBUTATION" == "Debian" ] || [ "$LINUX_DISTRIBUTATION" == "Ubuntu" ]; then
          declare -a NEEDED_SOFTWARE_LIST=(bash rsync wget grep telnet sed)

          for SOFTWARE in ${NEEDED_SOFTWARE_LIST[@]}; do
                  dpkg -l | grep -i $SOFTWARE | head -1 | if [[ "$(cut -d ' ' -f 1)" != "ii" ]]; then
                          echo -e "[ ${Red}FAILED ${RCol}]\t$SOFTWARE is NOT installed completely! Please install it...\n";
                          exit 1;
                  fi
          done
  # RedHat / CentOS
  elif [ -f /etc/redhat-release ] || [ "$LINUX_DISTRIBUTATION" == "RedHat" ] || [ "$LINUX_DISTRIBUTATION" == "CentOS" ]; then
          declare -a NEEDED_SOFTWARE_LIST=(bash rsync wget grep telnet sed)

          for SOFTWARE in ${NEEDED_SOFTWARE_LIST[@]}; do
                  if [[ "$(rpm -q $SOFTWARE)" == "package $SOFTWARE is not installed" ]]; then
                          echo -e "[ ${Red}FAILED ${RCol}]\t$SOFTWARE is NOT installed completely! Please install it...\n";
                          exit 1;
                  fi
          done
  else
          echo "[ ${Red}FAILED ${RCol}]\tYour system is currently not supported by this script.";
          exit 1;
  fi

我也认为,我的解决方案不是最好的。有人能调整一下吗?谢谢!)

提示:我声明了变量"NEEDED_SOFTWARE_LIST“两次,因为我认为我需要两个软件列表的”数组“,因为有些发行版需要另一个软件包。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-28 16:09:15

如果安装了软件包,而不是简单地检查某些实用程序的可用性,为什么要执行一个可怕的测试?

代码语言:javascript
复制
SCRIPTNAME="${0##*/}"

warn() {
    printf >&2 "$SCRIPTNAME: $*\n"
}

iscmd() {
    command -v >&- "$@"
}

checkdeps() {
    local -i not_found
    for cmd; do
        iscmd "$cmd" || { 
            warn $"$cmd is not found"
            let not_found++
        }
    done
    (( not_found == 0 )) || {
        warn $"Install dependencies listed above to use $SCRIPTNAME"
        exit 1
    }
}

checkdeps wget rsync realpath

但是,如果要检查包是否安装在Debian上,请替换此噩梦。

代码语言:javascript
复制
dpkg -l | grep -i $SOFTWARE | head -1 | if [[ "$(cut -d ' ' -f 1)" != "ii" ]]; then

使用

代码语言:javascript
复制
if dpkg -l $SOFTWARE; then
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20815433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档