Falta de fi para if declarações

0

Eu escrevi um script em que recebi algumas declarações aninhadas.

if [ choice = "1" ]; then
        if [ $package == *".tar.gz" ]; then //Could not find fi for this if
        tar -zxvf folder.tar.gz
        if [ $package == *".tar.bz2" ]; then
        tar -xvfj folder.tar.bz2
./configure
make 
make install
elif [ choice = "2" ]; then
dpkg -i package.deb
fi 
//Expected fi

Escrevi onde recebo os erros fi no script.

    
por Hudhud 11.10.2016 / 23:58

2 respostas

0

A estrutura básica das condições é a seguinte:

if [ condition ]; then
    dosomething
fi

Com mais:

if [ condition ]; then
    dosomething
elif [ condition ]; then
    dootherthing
else
    thelastchancetodosomething
fi

Além disso, acho que essa condição no seu código está errada:

if [ $package == *".tar.gz" ]; then
    tar -zxvf folder.tar.gz
fi

Se eu entendi direito, deveria ser algo como:

if echo $package | grep -qF ".tar.gz"; then
    tar -zxvf $package
fi

Ah, e use # para comentários em vez de // .

Corrigindo seu exemplo e melhorando o recuo para ficar mais claro:

if [ choice = "1" ]; then
    if echo $package | grep -qF ".tar.gz"; then
        tar -zxvf $package
    # You need to close previous 'if' with a 'fi' you want to use another
    # 'if' here below, but we can use 'elif', so we don't need to close it.
    elif echo $package | grep -qF ".tar.bz2"; then
        tar -xvfj $package
    fi
    cd ${package%.*.*} # this removes the .tar.* extension
    ./configure
    make 
    make install
elif [ choice = "2" ]; then
    dpkg -i $package
fi
    
por 12.10.2016 / 00:28
1

Esse é um caso típico em que você gostaria de usar case :

case $choice in
  (1)
     case $package in
       (*.tar.gz) tar -zxvf folder.tar.gz;;
       (*.tar.bz2) tar -jxvf folder.tar.bz2;;
     esac &&
       ./configure &&
       make &&
       make install
     ;;
  (2)
     dpkg -i package.deb
     ;;
esac
    
por 12.10.2016 / 00:35