检查是否存在可执行文件,如果不存在则安装

检查是否存在可执行文件,如果不存在则安装

我用谷歌搜索并找到了这篇文章:链接到帖子。 从那里我找到了一个控制是否安装以下程序/工具的命令。所以我决定将其投入使用。

#!/bin/bash
set -x

programs=$(bc nmap coreutils xmlstarlet)
if [ $(dpkg-query -W -f='${Status}' "$programs" 2>/dev/null | grep -c "ok installed") -eq 0 ];
then
apt-get update | apt-get install "$programs" -y;
fi

我这样做正确吗?或者这有什么问题吗?

program/tool name我只需要一种方法programs variable,然后它会在我的机器上运行它。

答案1

您可以简单地使用command -v来检查它是否已安装,if 条件上的返回代码将帮助您安装不是已安装

apt-get update
programs=(bc nmap coreutils xmlstarlet)

for program in "${programs[@]}"; do
    if ! command -v "$program" > /dev/null 2>&1; then
        apt-get install "$program" -y
    fi
done

该选项command -v符合 POSIX 标准。您可以apt-get update只运行一次,而不是每次循环迭代都运行。此外,您还定义了programs一个变量,它应该是一个用于迭代的数组。

答案2

如果您只想在缺少某些命令时退出脚本:

require() {
  local command not_found

  for command; do
    if ! command -v -- "${command}" > /dev/null 2>&1; then
      printf 'ERROR: Command not found: %s\n' "${command}" >&2
      ((not_found++))
    fi
  done

  if ((not_found > 0)); then
    printf 'ERROR: Missing commands: %d\n' "${not_found}"
    exit 1
  fi
}

但如果您还想安装缺少的命令:

install_command_if_not_found() {
  local command commands not_found

  for command; do
    if ! command -v -- "${command}" > /dev/null 2>&1; then
      commands+=("${command}")
      ((not_found++))
    fi
  done

  if ((not_found > 0)); then
    sudo apt-get update
    sudo apt-get install -y -- "${commands[@]}"
  fi
}

例子:

$ require cat foo curl bar mpv baz zenity
ERROR: Command not found: foo
ERROR: Command not found: bar
ERROR: Command not found: baz
ERROR: Missing commands: 3

笔记:

  1. 上面的代码使用 Bash 特定的语法。
  2. 考虑到有时命令的名称与其包的名称不同,因此第二个函数在这些情况下将不起作用。

相关内容