分叉图数据生成的 Bash 脚本问题

分叉图数据生成的 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 文件,并将最后 200 行存储在 diagbif.dat 中,然后增加弹跳球的一些变量,并再次将 impactMap.dat 的最后 200 行存储在 diagbif.dat 的末尾。如果有人能帮助我让它工作,那就太棒了!

答案1

您的版本存在问题:

  • 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

答案2

1-不要exec这样使用:它会代替正在运行的 shell 进程(即您的脚本)与执行的程序。因此,当程序结束时,控制权不会交还给您的脚本。

在终端中输入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,将输出放在该命令行上,然后尝试将输出作为 shell 命令执行。我猜这不是你想要做的。仅$(...)当你想要捕获命令的输出时才使用。tail按建议使用或:

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

4- +1,赞同 chronitis 的建议。

答案3

感谢 glenn jackman 和 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

开始吧!我发布这个答案是因为我确信它可以帮助人们处理变量操作等。我希望它能帮助到某些人!

ps:最后一行是使用 xmgrace 在图形上显示数据。

相关内容