Para loop no script de shell - adicione o intervalo no arquivo CSV
-
05-07-2019 - |
Pergunta
Estou tentando usar um for
Loop em um script de shell.
Estou executando um comando de um arquivo de texto. Desejo executar cada comando 10 vezes e inserir algumas estatísticas em um arquivo CSV. Depois que esse comando foi feito, quero iniciar o próximo, mas colocar uma quebra de linha no arquivo CSV após o primeiro comando que foi feito 10 vezes.
É o seguinte correto:
#Function processLine
processLine(){
line="$@"
for i in 1 2 3 4 5 6 7 8 9 10
do
START=$(date +%s.%N)
echo "$line"
eval $line > /dev/null 2>&1
END=$(date +%s.%N)
DIFF=$(echo "$END - $START" | bc)
echo "$line, $START, $END, $DIFF" >> file.csv 2>&1
echo "It took $DIFF seconds"
echo $line
done
}
Obrigado a todos por qualquer ajuda
ATUALIZAR
Ele está fazendo o loop corretamente, mas não consigo adicionar uma quebra de linha após a execução de cada comando 10 vezes.
Solução
processLine()
{
line="$@"
echo $line >> test_file
for ((i = 1; i <= 10 ; i++))
do
# do not move to the next line
echo -n "$i," >> test_file
done
# move to the next line: add the break
echo >> test_file
}
echo -n > test_file
processLine 'ls'
processLine 'find . -name "*"'
Outras dicas
Que tal apenas adicionar uma linha "echo >> file.csv
" depois done
? Ou você quer apenas uma linha vazia entre cada bloco de 10? Então você pode fazer o seguinte:
FIRST=1
processline()
{
if (( FIRST )) then
FIRST = 0
else
echo >> file.csv
fi
...rest of code...
}
Caso contrário, você pode dar um exemplo da saída desejada e da saída que você está obtendo agora.
Parece razoável. Isso faz o que você quer?
Você pode simplificar algumas coisas, por exemplo
DIFF=$(echo "$END - $START" | bc)
poderia ser apenas
DIFF=$((END - START))
Se o fim e o início são inteiros, e não há necessidade de colocar as coisas em variáveis, se você apenas as usar uma vez.
Se é não Fazendo o que quiser, edite a pergunta para descrever o problema (o que você o vê fazendo e o que prefere fazer).