![Bash 脚本用于检查包是否已安装,如果未安装,则安装它](https://linux22.com/image/1077864/Bash%20%E8%84%9A%E6%9C%AC%E7%94%A8%E4%BA%8E%E6%A3%80%E6%9F%A5%E5%8C%85%E6%98%AF%E5%90%A6%E5%B7%B2%E5%AE%89%E8%A3%85%EF%BC%8C%E5%A6%82%E6%9E%9C%E6%9C%AA%E5%AE%89%E8%A3%85%EF%BC%8C%E5%88%99%E5%AE%89%E8%A3%85%E5%AE%83.png)
#!/bin/bash
if [ "$(Which gimp)" != ""]
then
{
if [ "$(gimp -version)" != 2.8 ]
then
{
sudo apt-get remove gimp
sudo add-apt-repository ppa:otto-kesselgulasch/gimp
sudo apt-get update
sudo apt-get install gimp
}
else
echo You already have gimp 2.8
fi
}
else
{
sudo add-apt-repository ppa:otto-kesselgulasch/gimp
sudo apt-get update
sudo apt-get install gimp
}
fi
我正在尝试在 Bash 中制作 gimp 2.8 安装程序。我该如何让它工作?
答案1
if [ "$(which gimp)" != ""]
]
必须是[
命令的最后一个参数,并且必须是一个单独的参数,因此前面需要一个空格。请参阅Bash 陷阱 10。
但是,不要使用which
。它是一个非标准的外部命令,用于在 PATH 中查找文件。它在不同的系统上的行为不同,并且您不能真正依赖有用的输出或退出状态。shell 已经提供了更好的方法来检查命令是否存在,并且可以在任何系统上一致地工作,因此最好学习这些方法。请参阅Bash 常见问题 81。不过在这种情况下,您不需要测试 gimp 是否存在,只需运行gimp -version
,或查询 dpkg 有关 gimp 包的版本(请参阅dpkg 查询(1)) 就会告诉你它是否存在。
if [ "$(gimp -version)" != 2.8 ]
AndAC 已经给出了解决方案,但我将提供另一个解决方案;比较版本号。dpkg 提供了一种比较两个版本的方法,即dpkg --compare-versions ver1 op ver2
。例如dpkg --compare-versions 2.6.12 '<' 2.8.0-1ubuntu0ppa6~precise
将返回 true,因为版本 2.6.12 比 2.8.0-1ubuntu0ppa6~precise 旧。请参阅dpkg(1)。
该脚本中的所有括号({
和}
)都是没有意义的,它们没有任何用处,因此您最好将它们删除。
综合起来:
#!/usr/bin/env bash
# Query dpkg to get the version of the currently installed gimp package.
# The command returns false if the package is not installed.
if version=$(dpkg-query -W -f='${Version}' gimp 2>/dev/null); then
# Check if it's older than 2.8
if dpkg --compare-versions "$version" '<' 2.8; then
apt-get remove gimp || exit
else
printf 'Looks good.\n'
exit
fi
fi
add-apt-repository ppa:otto-kesselgulasch/gimp &&
apt-get update &&
apt-get install gimp
答案2
第一行,“which”是小写:
if [ "$(which gimp)" != ""]
这里:
if [ "$(gimp -version)" != 2.8 ]
您可以使用:
gimp_ver=$(gimp -version)
gimp_ver=$(echo ${gimp_ver##* } | cut -f1-2 -d'.')
if [ $gimp_ver != "2.8" ]
答案3
而不是捕获输出并查看它是否为空
if [ "$(which gimp)" != ""]
使用这个,它只考虑命令的退出状态(0 = 成功)
if which gimp &>/dev/null
then
使用括号来分组命令并不是必需的,但不会造成任何损害。
答案4
您可能会遇到的一些技术观察和疑虑:
- @AndAC 所说的一切。
add-apt-repository
可能不是每个人都会安装它。在我见过的全新安装中,12.04 默认包含它,但较旧的版本则不包含。你可能想在开始时停下来做如果 [ “$(which add-apt-repository)” != “”]
如果不存在,则在脚本中继续执行之前强制安装父包作为依赖项(注意:如果将此列表中的第三个要点作为脚本的一部分,则省略 sudo):sudo apt-get install python-software-properties
- 您可能希望利用此处描述的方法要求整个脚本以超级用户身份运行。我之所以这么说,是因为有些系统
sudoers
规定,每一个实例使用sudo
。我有几个脚本需要它,通过添加我链接的答案中的信息,您可以通过要求以超级用户身份运行脚本(通过sudo
)来部分避免该问题。