Ajuda com script Bash

2
#!/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      

Eu estou tentando fazer um instalador de gimp 2.8 no bash Por favor me ajude?

    
por MathCubes 27.06.2012 / 21:11

5 respostas

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

] deve ser o último argumento do comando [ , e deve ser um argumento separado, portanto você precisa de um espaço antes dele. Veja Bash Pitfall 10 .

Mas não use which . É um comando externo não padrão que procura um arquivo no PATH. Ele se comporta de maneira diferente em sistemas diferentes e você não pode depender de uma saída útil ou do status de saída. O shell já fornece melhores maneiras de verificar se existe um comando e funcionará de forma consistente em qualquer sistema, para melhor aprendê-los. Veja FAQ do Bash 81 . Neste caso, porém, você não precisa testar se o gimp existe, apenas executando gimp -version , ou consultando o dpkg sobre a versão do pacote gimp (veja dpkg-query(1) ), já informará se existe ou não.

if [ "$(gimp -version)" != 2.8 ]

A AndAC já deu uma solução para esta, mas eu vou fornecer outra; comparando os números da versão. O dpkg fornece uma maneira de comparar duas versões, a saber, dpkg --compare-versions ver1 op ver2 . Por exemplo. dpkg --compare-versions 2.6.12 '<' 2.8.0-1ubuntu0ppa6~precise retornará true desde que a versão 2.6.12 é mais antiga que 2.8.0-1ubuntu0ppa6 ~ precision. Veja dpkg (1) .

Todos os colchetes ( { e } ) nesse script são inúteis, não servem a nenhum propósito, então você também pode removê-los.

Colocando tudo isso junto:

#!/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
    
por geirha 28.06.2012 / 01:37
1

Em vez de capturar a saída e ver se ela está vazia

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

use isso, que apenas considera o status de saída do comando (0 = sucesso)

if which gimp &>/dev/null
then 

Seu uso de chaves para agrupar comandos não é necessário, mas não vai doer.

    
por glenn jackman 27.06.2012 / 22:45
0

Primeira linha, "qual" é minúscula:

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

Aqui:

if [ "$(gimp -version)" != 2.8 ]

Você pode usar:

gimp_ver=$(gimp -version)
gimp_ver=$(echo ${gimp_ver##* } | cut -f1-2 -d'.')
if [ $gimp_ver != "2.8" ]
    
por AndAC 27.06.2012 / 22:01
0

Como não há informações sobre o que está errado, é difícil ajudar. Mas, no mínimo, você deve corrigir a ortografia de "which", você escreveu com um W maiúsculo e o bash faz distinção entre maiúsculas e minúsculas.

    
por TLE 27.06.2012 / 22:09
0

Algumas observações e preocupações técnicas que você encontrará:

  1. Tudo o que o @AndAC disse.
  2. add-apt-repository pode não estar instalado no sistema de todos. Nas instalações limpas que vi, o 12.04 inclui por padrão, mas os mais antigos não. Você pode querer uma parada no começo para fazer
    if [ "$(which add-apt-repository)" != ""]
    e em instâncias onde ele não existe, force a instalação do pacote pai como uma dependência antes de continuar no script (note: omit sudo se você pegar o terceiro ponto de marcador nesta lista como parte do seu script): sudo apt-get install python-software-properties
  3. Você pode utilizar os métodos descritos aqui para exigir que todo o script seja executado como superusuário . E digo isso porque em alguns sistemas, há sudoers policy para exigir uma senha para cada e toda instância do uso de sudo . Eu tenho alguns scripts que precisavam disso, e adicionando as informações na resposta que eu vinculei, você pode evitar parcialmente esse problema exigindo que você execute o script como superusuário (via sudo ).
por Thomas Ward 27.06.2012 / 22:15