我写了一个小的bash脚本(我的第一个)执行以下操作:
sed -e 's/Alpha=0/Alpha=x/' -e 's/Beta=0/Beta=y/' <file.pov >tmpfile.pov
povray Width=480 Height=360 +Itmpfile.pov +Ofile_x_y.png
一切都按预期运行但现在我想将这两行包装在一个循环中,x = 0:30:180和y = 0:30:90(编辑:我的意思是{0中所有可能的x组合, 30,60,90,120,180}和{0,30,60,90}中的y。
因此,例如对于x = 60和y = 30,代码应该表现得像这样:
sed -e 's/Alpha=0/Alpha=60/' -e 's/Beta=0/Beta=30/' <file.pov >tmpfile.pov
povray Width=480 Height=360 +Itmpfile.pov +Ofile_60_30.png
我知道,这不应该太难,但出于某种原因,我不能自己解决。
很抱歉打扰我的新手问题!
答案 0 :(得分:1)
将seq用于for循环:
for x in `seq 0 30 180`
do for y in `seq 0 30 90`
do sed -e 's/Alpha=0/Alpha='$x'/' -e 's/Beta=0/Beta='$y'/' <file.pov >tmpfile.pov
fn="file_${x}_${y}.png"
povray Width=480 Height=360 +Itmpfile.pov +O${fn}
done done
即使您不需要数字, seq
也是一个很棒的工具
for i in `seq 10`
do call_me_ten_times
done
答案 1 :(得分:1)
这是一个棘手的bash hack,但它有助于将两个嵌套的for循环减少为一个while循环:
while read x y; do
sed -e 's/Alpha=0/Alpha='"$x"'/' -e 's/Beta=0/Beta='"$y"'/' <file.pov >"tmpfile${x}_$y.pov"
done < <(echo {0..180..30}' '{0..90..30} | tr ' ' '\n' | paste - -)
最后的流程替换会生成您指定范围的所有组合。
剩下的一个问题应该是输出文件名。因为你每次都要覆盖文件。我认为如果你改变文件名会更好。也许是我的方式。