Subshell no script não será impresso corretamente

0

Por que meu shell e subshell só imprimem a primeira hora no meu loop for? Ele deve passar por todas as 24 horas em um dia, mas só imprime a primeira hora corretamente.

{
for D in $(seq -f "%02g" 1 9); do

File=($(find -name "PaloAlto_traffic_$M-$D-$Y.zip"))
unzip -j $File
Filetmp=($(find -name "traffic_$M-$D-$Y.total"))

D=$(echo $D | sed -e 's/^0*//')

for i in $(seq -f "%02g" 0 23); do

echo $i 

    grep -F -s "$month  $D $i:" $Filetmp > TempOutput1.txt

    countAllow=($(grep -F -c 'allow' TempOutput1.txt))
    countDeny=($(grep -F -c 'deny' TempOutput1.txt))
    #Add new 'variable=($(grep)) statement here'

    echo -e "$M/0$D/$Y $i:00,$countAllow,$countDeny" >> AD-Results-$month-$Y
    echo "$((10#$i+1))/24       hours completed for $month $D" 
    rm -f $Filetmp
done
done
} & #Subshell 2A
{ 
for D in $(seq -f "%02g" 10 18); do

File=($(find -name "PaloAlto_traffic_$M-$D-$Y.zip"))
unzip -j $File
Filetmp=($(find -name "traffic_$M-$D-$Y.total"))

for i in $(seq -f "%02g" 0 23); do

    grep -F -s "$month $D $i:" $Filetmp > TempOutput2.txt

    countAllow=($(grep -F -c 'allow' TempOutput2.txt))
    countDeny=($(grep -F -c 'deny' TempOutput2.txt))
    #Add new 'variable=($(grep)) statement here'

    echo -e "$M/$D/$Y $i:00,$countAllow,$countDeny" >> AD-Results-$month-$Y
    echo "$((10#$i+1))/24       hours completed for $month $D" 
    rm -f $Filetmp
done
done
}
wait

Exemplo de dados de saída: (Date Time, Allow, Deny)

05/10/2014 00:00,3242,6758
05/10/2014 01:00,0,0 #This should be the same as above line but outputs 0,0
    
por Roboman1723 27.06.2014 / 21:24

1 resposta

2

Você provavelmente remove o arquivo chamado $Filetmp muito em breve. O comando rm está dentro do loop interno:

        rm -f $Filetmp
    done
done

Devido a isso, o arquivo é removido após a primeira iteração através do loop interno (ou seja, quando $ i = 0). As iterações subseqüentes ($ i > 0) não localizarão o arquivo. Nenhum erro é relatado porque você chama o grep com a opção -s , mas as contagens resultantes são obviamente zero.

O comando rm deve estar fora do loop interno:

    done
    rm -f $Filetmp
done
    
por Ruud Helderman 28.06.2014 / 00:43