Помогите с сценарием 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      

Я пытаюсь сделать установщик gimp 2.8 в bash. Пожалуйста, помогите мне?

2
задан 27 June 2012 в 23:57

5 ответов

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
0
ответ дан 27 June 2012 в 23:57

Так как нет информации о том, что идет не так, трудно помочь. Но, по крайней мере, вы должны исправить неправильное написание слова "который", вы написали его заглавной буквой W, а bash чувствителен к регистру.

0
ответ дан 27 June 2012 в 23:57

Вместо того, чтобы захватывать вывод и видеть, пусто ли оно

if [ "$(which gimp)" != ""] 

, используйте это, что просто учитывает состояние выхода команды (0 = успех)

if which gimp &>/dev/null
then 

Использование скобок группировать команды не обязательно, но не повредит.

0
ответ дан 27 June 2012 в 23:57

Первая строка, «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" ]
0
ответ дан 27 June 2012 в 23:57

Несколько технических замечаний и проблем, с которыми вы столкнетесь:

  1. Все, что сказал @AndAC.
  2. add-apt-repository не может быть установлен в любой системе. На чистых установках, которые я видел, 12.04 включает его по умолчанию, но на старых нет. Возможно, вы захотите сделать остановку в начале
    if [ "$(which add-apt-repository)" != ""]
    , и в тех случаях, когда он не существует, принудительно установите родительский пакет в качестве зависимости, прежде чем продолжить в сценарии (примечание: опустите sudo, если вы берете третий пункт в этот список является частью вашего скрипта): sudo apt-get install python-software-properties
  3. Возможно, вы захотите использовать методы, описанные здесь, чтобы весь ваш скрипт работал как суперпользователь . И я говорю это потому, что в некоторых системах существует политика sudoers, требующая пароль для каждого и каждого экземпляра использования sudo. У меня есть несколько скриптов, которые нуждались в этом, и, добавив информацию в ответ, который я связал, вы можете частично избежать этой проблемы, требуя, чтобы вы запускали скрипт как суперпользователь (через sudo).
0
ответ дан 27 June 2012 в 23:57

Другие вопросы по тегам:

Похожие вопросы: