#!/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
Я пытаюсь сделать установщик gimp 2.8 в bash. Пожалуйста, помогите мне?
if [ "$(which gimp)" != ""]
]
должен быть последним аргументом команды [
, и это должен быть отдельный аргумент, поэтому перед ним должен быть пробел. См. Bash Pitfall 10 .
Но не используйте which
. Это нестандартная внешняя команда, которая ищет файл в PATH. Он ведет себя по-разному в разных системах, и вы не можете полагаться на полезный вывод или состояние выхода. Оболочка уже предоставляет более эффективные способы проверки, существует ли команда и будет ли она работать согласованно в любой системе, поэтому лучше изучите ее. См. Bash FAQ 81 . Однако в этом случае вам не нужно проверять, существует ли gimp, просто запустите gimp -version
или запросите dpkg о версии пакета gimp (см. dpkg-query (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 ~ точной. См. 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
Так как нет информации о том, что идет не так, трудно помочь. Но, по крайней мере, вы должны исправить неправильное написание слова "который", вы написали его заглавной буквой W, а bash чувствителен к регистру.
Вместо того, чтобы захватывать вывод и видеть, пусто ли оно
if [ "$(which gimp)" != ""]
, используйте это, что просто учитывает состояние выхода команды (0 = успех)
if which gimp &>/dev/null
then
Использование скобок группировать команды не обязательно, но не повредит.
Первая строка, «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" ]
Несколько технических замечаний и проблем, с которыми вы столкнетесь:
add-apt-repository
не может быть установлен в любой системе. На чистых установках, которые я видел, 12.04 включает его по умолчанию, но на старых нет. Возможно, вы захотите сделать остановку в начале if [ "$(which add-apt-repository)" != ""], и в тех случаях, когда он не существует, принудительно установите родительский пакет в качестве зависимости, прежде чем продолжить в сценарии (примечание: опустите sudo, если вы берете третий пункт в этот список является частью вашего скрипта):
sudo apt-get install python-software-properties
sudoers
, требующая пароль для каждого и каждого экземпляра использования sudo
. У меня есть несколько скриптов, которые нуждались в этом, и, добавив информацию в ответ, который я связал, вы можете частично избежать этой проблемы, требуя, чтобы вы запускали скрипт как суперпользователь (через sudo
).