Bash 脚本来检查是否安装了一个包,如果没有安装它

Mat*_*bes 2 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      
Run Code Online (Sandbox Code Playgroud)

我正在尝试在 Bash 中制作一个 gimp 2.8 安装程序。我怎样才能让它发挥作用?

gei*_*rha 7

if [ "$(which gimp)" != ""]
Run Code Online (Sandbox Code Playgroud)

]必须是[命令的最后一个参数,并且它必须是一个单独的参数,因此在它之前需要一个空格。请参阅Bash 陷阱 10

但是,不要使用which. 它是一个非标准的外部命令,用于在 PATH 中查找文件。它在不同系统上的行为不同,您不能真正依赖有用的输出或退出状态。shell 已经提供了更好的方法来检查命令是否存在,并且可以在任何系统上一致地工作,所以更好地学习这些方法。请参阅Bash 常见问题解答 81。但是,在这种情况下,您不需要测试 gimp 是否存在,只需运行gimp -versiondpkg 或查询有关 gimp 包版本的dpkg(请参阅dpkg-query(1)),就会告诉您它是否存在。

if [ "$(gimp -version)" != 2.8 ]
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)