2
respostas

Falha no código

O código abaixo é executado e a mensagem de saída é "Arquivos convertidos com sucesso". O detalhe é que eu alterei o diretório "imagens-livros" tirando o s para forçar um erro. Onde está a falha no código?

Outro detalhe: coloquei uma linha adicional "echo $?" logo após a chamada da função "converter" e para todas as situações o valor é sempre 0 (zero).

#!/bin/bash

converter(){
        cd ~/Downloads/imagens-livro

        if [ ! -d png ]
        then
                mkdir png
        fi

        for imagem in *.jpg
        do
                local imgsemext=$(ls $imagem | awk -F. '{ print $1 }')
                convert $imgsemext.jpg png/$imgsemext.png
        done
}
converter 2>erro.txt
if [ $? -eq 0 ]
then
        echo "Arquivos convertidos com sucesso"
else
        echo "Houve falha na conversão"
fi
2 respostas

Olá Bruno,

Estranho ter esse comportamento, você poderia por favor confirmar no terminal o que ocorre quando você coloca o comando cd ~/Downloads/imagens-livro, ocorre um erro ? Você teria os dois diretórios: imagens-livro e imagen-livro?

Oi Bruno!

Se você olhar o manual do Bash (man bash) e procurar pela seção Special Parameters (/Special Parameters) poderá ver que o caracter ?: "Expands to the exit status of the most recently executed foreground pipeline."

Ou seja, como você está testando o status da saída apenas após a execução da função converter, todos os demais comandos (mkdir e o laço for) são executados e o bash olha o status final como executado sem erro.

Uma das várias soluções possíveis, seguindo seu código, seria colocar imediatamente após o cd ~/Downloads/imagens-livro o teste conforme abaixo:

    if [ $? -ne 0 ]
    then
        return 9   
    fi

Assim o script NÃO continua para o mkdir e o laço for e sai com erro. Minha saida ficou assim:

diniz@alura:/tmp/teste$ sh script.sh 
Houve falha na conversão
diniz@alura:/tmp/teste$ cat erro.txt 
script.sh: 4: cd: can't cd to /tmp/teste/imagens-livro