我有一个 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 在图形上显示数据。