teste para arquivo em branco não está falhando como esperado

0

Eu tenho o seguinte trecho de código que verifica o conteúdo de dois arquivos em relação a alguns valores para retornar um resultado.

if [[ "$(/bin/cat ${TMP_FILE})" != "" ]]
then
    if [[ $(cat ${TMP_FILE}) -gt ${TEST1} ]]
    then
        res=503
        sec=101
    elif [[ $(cat ${TMP_FILE2}) -gt ${TEST2} ]]
    then
        res=503
        sec=102
    else
        res=200
        sec=103
    fi
else
    res=503
    sec=999
fi

Basicamente, se $TMP_FILE estiver em branco, ele pula direto para o final sec=999 .

Mas também estou obtendo um resultado pelo qual se $TMP_FILE2 estiver em branco, ele também salta para o final. Como é isso, como eu esperaria que falhasse na segunda ou terceira seção ( sec=102 ou sec=103 ).

    
por IGGt 19.10.2017 / 15:46

3 respostas

2

Você leu o arquivo três vezes (!) - desde que provavelmente haja armazenamento em cache de arquivos fornecido pelo SO que o torna um pouco menos ruim (o pior caso: seu script lê três coisas diferentes conforme o arquivo muda entre as leituras), mas pode seja mais sensato ler o conteúdo do arquivo, uma vez, sem forçar o cat , e depois usar os testes do shell nesses conteúdos.

#!/usr/bin/env bash

# look ma no cat!
TMP_FILE_CONTENTS=$(<"$1")

if [[ -n "$TMP_FILE_CONTENTS" ]]; then
    if [[ "$TMP_FILE_CONTENTS" -gt 42 ]]; then
        echo more
    else
        echo less
    fi
else
    echo empty
fi

que para mim produz algo como

$ :> empty
$ echo 5 > small
$ echo 999999 > big
$ ./reed empty
empty
$ ./reed small
less
$ ./reed big  
more
$ 
    
por 19.10.2017 / 16:01
2

Use o operador -s para verificar se os arquivos não estão vazios; você não precisa usar cat .

Além disso, observe que, no elif , verifiquei se o segundo arquivo não está vazio e, se isso for bem-sucedido, farei a comparação.

if [ -s "${TMP_FILE}" ]
then
    if [ $(cat "${TMP_FILE}") -gt ${TEST1} ]
    then
        res=503
        sec=101
    elif [ -s "${TMP_FILE2}" ] && [ $(cat "${TMP_FILE2}") -gt ${TEST2} ]
    then
        res=503
        sec=102
    else
        res=200
        sec=103
    fi
else
    res=503
    sec=999
fi
    
por 19.10.2017 / 16:50
0

Você definitivamente não precisa ler nenhum arquivo mais de uma vez. Estou um pouco incerto sobre qual lógica você gostaria de implementar quando o segundo arquivo estiver indisponível ou vazio, mas essa é uma sugestão que mostra como ler valores de arquivos e como reagir a arquivos vazios:

#!/bin/sh

if read number <file1; then
    if [ "$number" -gt "$test1" ]; then
        res=503
        sec=101
    else
        if read number <file2 && [ "$number" -gt "$test2" ]; then
            res=503
            sec=102
        else
            res=200
            sec=103
        fi
    fi
else
    res=503
    sec=999
fi

Esse script passará para a última ramificação else se o primeiro arquivo não existir ou estiver vazio. Caso contrário, usará o número lido do arquivo no primeiro teste.

O segundo arquivo será lido se o primeiro teste falhar e sua else branch ( res=200 , sec=103 ) for obtida se o segundo arquivo não existir, estiver vazio ou se o número for maior que $test2 .

Nenhuma verificação é feita para saber se as coisas lidas dos arquivos são realmente números. Se não estiverem, você receberá erros de "expressão de inteiração esperada" nos dois testes aritméticos e eles falharão.

Relacionados:

por 18.07.2018 / 21:23