Qual é o erro lógico neste código?

3

Eu escrevi algum código para baixar favicons. Tem um erro lógico que não consigo ver.

#!/bin/bash
ico="1";
if [[ $ico =~ ^-?[0-9]+$ ]]; then
wget -P $HOME/Downloads/ http://www.google.com/favicon.ico
elif [[ $ico -eq 1 ]]; then 
wget -P $HOME/Downloads/ http://www.cnet.com/favicon.ico
elif [[ $ico -eq 3 ]]; then
wget -P $HOME/Downloads/ https://www.facebook.com/favicon.ico
else
wget -P $HOME/Downloads/ https://www.twitter.com/favicon.ico
fi

De acordo com a minha lógica, quando a variável ico é 1 , deve baixar favicons do Google e do CNet, pois ela satisfaz ambas as condições (é um inteiro e tem o valor de 1). No entanto, só faz o download do favicon do Google, não do CNet.

    
por potholiday 16.06.2015 / 09:03

1 resposta

9

if .. elif .. else só acionará a cláusula uma . elif é a abreviatura de "else if", por isso, como else , depende de as verificações anteriores não serem ativadas.

Se você quiser avaliar cada condição separadamente para que mais de uma possa ser chamada, cada uma delas precisa ser sua própria if . Também poderíamos eliminar o else (que sempre será chamado):

#!/bin/bash
ico="1";

if [[ $ico =~ ^-?[0-9]+$ ]]; then
    wget -P $HOME/Downloads/ http://www.google.com/favicon.ico
fi

if [[ $ico -eq 1 ]]; then 
    wget -P $HOME/Downloads/ http://www.cnet.com/favicon.ico
fi

if [[ $ico -eq 3 ]]; then
    wget -P $HOME/Downloads/ https://www.facebook.com/favicon.ico
fi

wget -P $HOME/Downloads/ https://www.twitter.com/favicon.ico

Na reflexão, você pode querer algo assim:

#!/bin/bash
ico="1";

if [[ $ico =~ ^-?[0-9]+$ ]]; then
    if [[ $ico -eq 1 ]]; then 
        wget -P $HOME/Downloads/ http://www.cnet.com/favicon.ico
    elif [[ $ico -eq 3 ]]; then
        wget -P $HOME/Downloads/ https://www.facebook.com/favicon.ico
    else
        wget -P $HOME/Downloads/ http://www.google.com/favicon.ico
    fi
else
    wget -P $HOME/Downloads/ https://www.twitter.com/favicon.ico
fi

Primeiro, verifica se a entrada é um numeral. Se for e é 1, cnet. Se é 2, facebook. Se é outro número, google. Se não for um número, twitter.

É um pouco estranho tentar inferir o que você quer de um problema abstrato como esse, mas isso faz mais sentido para mim.

    
por Oli 16.06.2015 / 09:14