Проблема скриптов Bash для генерации данных бифуркационной диаграммы

У меня есть скрипт Bash, который не работает, и я не знаю, почему ... Моя программа Bouncingball работает отлично, когда я вызываю ее вручную

#!/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

Что я хочу сделать с этим код генерирует файл ImpactMap.dat с помощью bouncingball и сохраняет 200 последних строк в diagbif.dat, затем увеличивает некоторую переменную bouncing ball, а angain сохраняет 200 последних строк удараMap.dat в конце diagbif.dat. Если кто-то может помочь мне заставить его работать, это было бы здорово!

1
задан 8 February 2017 в 13:58

3 ответа

Проблемы с вашей версией:

  • for i in $(number) не запускается NUMBER раз, но один раз с i=NUMBER.
  • ./home/antoine/... начинается с ., поэтому интерпретируется как путь относительно вашего текущего каталога. Поскольку вы, вероятно, запускаете его из /home/antoine, он будет интерпретироваться как /home/antonine/home/antoine/..., что, вероятно, не работает. Удалите ведущий ., чтобы сделать его абсолютным путем.
  • Использование цикла и sed для извлечения последних 200 строк можно сделать более эффективно с помощью tail.
  • Математика должна быть включена в $(( ... )), иначе она не будет правильно интерпретирована.

Попробуйте (не тестировали):

#!/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
0
ответ дан 8 February 2017 в 13:58

1- Не используйте exec так: он заменит запущенный процесс оболочки (т. Е. Ваш скрипт) на исполняемую программу. Поэтому, когда программа завершится, управление не вернется к вашему сценарию.

Для получения более подробной информации наберите help exec.

2- Используйте read -p для создания настраиваемой подсказки:

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- При этом

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

запустится sed, поместите вывод в эту командную строку и затем попытаться выполнить вывод как команды оболочки . Я полагаю, это не то, что вы пытаетесь сделать. Используйте $(...), только если вы хотите захватить вывод команды. Используйте tail как предложено или:

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

4-1 для подсказок хронита.

0
ответ дан 8 February 2017 в 13:58

Я нашел ответ благодаря Гленну Джекману и хрониту:

#!/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

вот и мы! Я публикую этот ответ, потому что уверен, что он может помочь людям с манипуляциями с переменными и так далее. Надеюсь, это кому-нибудь поможет!

пс: последняя строка сделана для отображения данных на графике с помощью xmgrace.

0
ответ дан 8 February 2017 в 13:58

Другие вопросы по тегам:

Похожие вопросы: