У меня есть скрипт 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. Если кто-то может помочь мне заставить его работать, это было бы здорово!
Проблемы с вашей версией:
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
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 для подсказок хронита.
Я нашел ответ благодаря Гленну Джекману и хрониту:
#!/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.