#!/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 安装程序。我怎样才能让它发挥作用?
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)