我用谷歌搜索并找到了这篇文章:链接到帖子。 从那里我找到了一个控制是否安装以下程序/工具的命令。所以我决定将其投入使用。
#!/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
笔记:
- 上面的代码使用 Bash 特定的语法。
- 考虑到有时命令的名称与其包的名称不同,因此第二个函数在这些情况下将不起作用。