Bash 脚本用于检查包是否已安装,如果未安装,则安装它

Bash 脚本用于检查包是否已安装,如果未安装,则安装它
#!/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

您可能会遇到的一些技术观察和疑虑:

  1. @AndAC 所说的一切。
  2. add-apt-repository可能不是每个人都会安装它。在我见过的全新安装中,12.04 默认包含它,但较旧的版本则不包含。你可能想在开始时停下来做
    如果 [ “$(which add-apt-repository)” != “”]
    如果不存在,则在脚本中继续执行之前强制安装父包作为依赖项(注意:如果将此列表中的第三个要点作为脚本的一部分,则省略 sudo):sudo apt-get install python-software-properties
  3. 您可能希望利用此处描述的方法要求整个脚本以超级用户身份运行。我之所以这么说,是因为有些系统sudoers规定,每一个实例使用sudo。我有几个脚本需要它,通过添加我链接的答案中的信息,您可以通过要求以超级用户身份运行脚本(通过sudo)来部分避免该问题。

相关内容