Problema de script Bash para uma geração de dados de diagrama de bifurcação

1

Eu tenho um script Bash que não funciona e eu não sei porque ... Meu programa Bouncingball roda perfeitamente quando eu o chamo manualmente

#!/bin/bash

echo "enter starting value"
read start
echo "enter size of steps"
read steps
echo "enter number of steps"
read number
echo "enter the suitable pecisiion"
read precision


for i in $(number)
    do
        exec ./home/antoine/Bouncingball/bin/Debug/Boungingball 0.9 120 "$start+($i*$steps)" 3.5 0.95 "$precision"
        for j in 200
            do
                $(sed -n ($(precision)-200+$(j))'p' impactMap.dat) >> diagbif.dat
            done
    done

O que eu quero fazer com esse código é gerar um arquivo impactMap.dat com bouncingball e armazenar as 200 últimas linhas em diagbif.dat, depois incrementar alguma variável de bola quicadora e angain armazenar as 200 últimas linhas de impactMap.dat em o fim de diagbif.dat. Se alguém puder me ajudar a fazer funcionar, seria incrível!

    
por noxygen 04.01.2013 / 16:02

3 respostas

3

Problemas com sua versão:

  • for i in $(number) não é executado NUMBER vezes, mas uma vez com i=NUMBER .
  • ./home/antoine/... começa com . , então é interpretado como um caminho relativo ao seu diretório atual. Como você provavelmente o executa a partir de /home/antoine , ele o interpretará como /home/antonine/home/antoine/... , o que provavelmente não funciona. Exclua o . inicial para torná-lo um caminho absoluto.
  • O uso de um loop e sed para extrair as últimas 200 linhas pode ser feito de forma mais eficiente com tail .
  • A matemática precisa ser incluída em $(( ... )) ou não será interpretada corretamente.

Experimente (não testou):

#!/bin/bash

echo "enter starting value"
read start
echo "enter size of steps"
read steps
echo "enter number of steps"
read number
echo "enter the suitable pecisiion"
read precision

for i in $(seq $number); do
    /home/antoine/Bouncingball/bin/Debug/Boungingball 0.9 120 $(($start+($i*$steps))) 3.5 0.95 "$precision"
    tail -n 200 impactMap.dat >> diagbif.dat
done
    
por chronitis 04.01.2013 / 16:38
1

1- Não use exec assim: ele irá substituir o processo do shell em execução (ou seja, seu script) com o programa exec'ed. Então, quando o programa terminar, o controle não passará para o seu script.

Em um terminal, digite help exec para mais detalhes.

2- Use read -p para ter um prompt personalizado:

read -p "enter starting value: " start
read -p "enter size of steps: " steps
read -p "enter number of steps: " number
read -p "enter the suitable precision: " precision

3- Fazendo isso

$(sed ...) >> diagbif.dat

executará o sed, colocará a saída nessa linha de comando e tentará executar a saída como comandos do shell . Eu suponho que não é isso que você está tentando fazer. Use somente $(...) se você quiser capturar a saída de um comando. Use tail como sugerido ou:

sed -n "$((precision-200+j))p" impactMap.dat >> diagbif.dat

De 4 a +1 para sugestões de cronite.

    
por glenn jackman 04.01.2013 / 17:36
0

Eu encontrei a resposta graças a Glenn Jackman e Chronitis:

#!/bin/bash
cd /home/antoine/Bouncingball/bin/Debug/

read -p "enter starting value: " start
read -p "enter ending value: " ending
read -p "enter number of steps: " number
read -p "enter the suitable precision: " precision
read -p "enter the diagram definition: " diagram
steps=$(echo "($ending - $start) / $number" | bc -l )

for i in $(seq $number); do
    if (( $i % 100 == 0)); then
        rm impactMap.dat
        echo "!!!=== ETAPE : $i sur $number ===!!!"
    fi
    /home/antoine/Bouncingball/bin/Debug/Bouncingball 0.9 120 $(echo "$start + $i * $steps" | bc -l) 3.5 0.95 "$precision" 1
    tail -n "$diagram" impactMap.dat >> diagbif.dat
done

xmgrace diagbif.dat -autoscale xy

aqui vamos nós! Eu posto esta resposta porque tenho certeza que pode ajudar pessoas com manipulação de variáveis e qualquer que seja. Espero que ajude alguém!

ps: última linha é feita para exibir os dados em um gráfico com xmgrace.

    
por noxygen 05.01.2013 / 00:03