bash: if / elif / fi não é avaliado corretamente

2

Eu tenho um script que verifica um arquivo PNG específico em três diretórios. O primeiro é local e é verificado primeiro. O segundo é um compartilhamento remoto e é verificado apenas se o arquivo não estiver disponível no disco rígido local. Em algumas circunstâncias, o terceiro diretório (um diretório de arquivamento) é pesquisado como recursivo para o arquivo.

Por alguns motivos, a segunda parte da minha construção if / elif / fi não funciona. Eu não vejo nada porque o arquivo PNG não é encontrado, mesmo que esteja definitivamente disponível. Eu verifiquei novamente os erros de digitação e todas as variáveis, adicionei declarações de log em todos os lugares. A última tentativa foi dividir a avaliação de "é um arquivo" e "é maior que 0 bytes" para obter mais logmessages. quando estou procurando o arquivo manualmente (com "find" ou um gerenciador de arquivos), posso encontrá-lo de uma vez, mas o script não o encontra.

A primeira e a terceira parte estão funcionando bem, e agora estou um pouco sem saída, não tenho idéia do motivo pelo qual o meu script não encontra o arquivo. Alguém pode me ajudar aqui?

Este é o meu código:

#!bin/bash
[...snip...]
find $printjobtemp -type f -maxdepth 1 -iname $printjobsearch | \
while read filename
do
    # check if file is > 0 Bytes
    # skip if 0 bytes, process if larger than 0 bytes
    if [ -s "$filename" ]
    then

        if [ -f "$pngdir/$pngname" ] && [ -s "$pngdir/$pngname" ]
        then
            # png is available & > 0 bytes -> move printjob to printjobdirectory
            writelog "    found $pngname in $pngdir"

            # create a copy for the archive
            fileoperation='cp -fv $filename $printjobdir/archive/$printjobfile 2>&1'
            writelog "    cp $fileoperation"

            # move printjob to printjobdir
            fileoperation='mv -fv $filename $printjobdir/$printjobfile 2>&1'
            writelog "    mv $fileoperation"

        # if not in pngdir: check in pngtemp
        elif [ -f "$pngtemp/$pngname" ]
        then
            writelog "    found in $pngtemp/$pngname - checking size..."
            if [ -s "$pngtemp/$pngname" ]
            then
            writelog "    found $pngname in $pngtemp and size is >0"

            # move png to pngdir
            fileoperation='mv -fv $pngtemp/$pngname $pngdir/$pngname  2>&1'
            writelog "    mv $fileoperation"

            # create a copy for the archive
            fileoperation='cp -fv $filename $printjobdir/archive/$printjobfile  2>&1'
            writelog "    cp $fileoperation"

            # move printjob to printjobdir
            fileoperation='mv -fv $filename $printjobdir/$printjobfile  2>&1'
            writelog "    mv $fileoperation"
        fi
        # png not in pngdir & pngtemp
        # check if it is an old printjob (reprint) and search in pngarchive
        elif [ $pngage -gt $pngthreshold ]
        then
            writelog "    png not found and printjob is considered as \"old\" - checking $pngarchive"
            pngarchivefile='find $pngarchive -type f -iname $pngname -printf '%p\n' | sort | tail -n 1'
            writelog "    searchresult: $pngarchivefile"

            # check if searchresult contains a value
            if [ -n "$pngarchivefile" ]
            then
                # searchresult is not NULL -> move the png back to $pngdir
                writelog "    moving $pngarchivefile to $pngdir"

                # move png to pngdir
                fileoperation='mv -fv $pngarchivefile $pngdir/$pngname  2>&1'
                writelog "    mv $fileoperation"

                # create a copy for the archive
                fileoperation='cp -fv $filename $printjobdir/archive/$printjobfile  2>&1'
                writelog "    cp $fileoperation"

                # move printjob to printjobdir
                fileoperation='mv -fv $filename $printjobdir/$printjobfile  2>&1'
                writelog "    mv $fileoperation"

            else
                # searchresult is NULL - complain about this and do nothing
                writelog "    $pngname not found in archive - this should be checked manually!"
            fi
        else
            writelog "    $pngname not existing or 0 Bytes - skipping $printjobfile"
            # writelog "    pngtemp: $pngtemp/$pngname"
        fi
    fi
done
[...snap...]

Atenciosamente,

dura

    
por dura-zell 22.12.2015 / 09:47

1 resposta

1

Você deixou seus blocos if...fi confusos. Aqui está a estrutura atual do seu script:

if [ -f "$pngdir/$pngname" ] && [ -s "$pngdir/$pngname" ]
then

elif [ -f "$pngtemp/$pngname" ]
then
    if [ -s "$pngtemp/$pngname" ]
    then

    fi
elif [ $pngage -gt $pngthreshold ]
then
    if [ -n "$pngarchivefile" ]
    then

    else

    fi
else

fi
fi

Como você pode ver, você tem um fi extra. Se você não está recebendo um erro de sintaxe, então o% final fi está terminando algo da parte anterior do seu script, o que, portanto, provavelmente não está fazendo o que você pensa que é.

Em uma nota separada, [ -f $pngname ] verifica se o destino é um arquivo normal. Se você quer apenas verificar se ele existe e tem certeza de que, se isso acontecer, certamente será um arquivo e não um diretório ou qualquer outra coisa, você pode pular o -f e usar apenas -s diretamente. [ -s file ] retornará false se o arquivo não existir.

Eu não posso dizer exatamente por que seu script está falhando, já que você não está mostrando o restante do script. Se você editar sua pergunta e fornecer um exemplo mínimo de trabalho que reproduza o erro, posso atualizar essa resposta. Outra possibilidade é que seu arquivo de destino seja, na verdade, um link; nesse caso, o [ -f file ] falhará. Se você também precisar trabalhar para links, substitua os [ -f file ] tests por [ -e file ] .

    
por 22.12.2015 / 11:14