bash中的数字和字符串操作

bash中的数字和字符串操作,bash,sed,Bash,Sed,我编写了一个小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 sed-e's/Alpha=0/Alpha=x/'-e's/Beta=0/Beta=y/'tmpfile.pov povray Width=480 Height

我编写了一个小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 
sed-e's/Alpha=0/Alpha=x/'-e's/Beta=0/Beta=y/'tmpfile.pov
povray Width=480 Height=360+Itmpfile.pov+Ofile_x_y.png
一切都按预期进行,但现在我想将这两行打包成一个循环,用于x=0:30:180和y=0:30:90(编辑:我指的是{0,30,60,90120180}中x和{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
sed-e's/Alpha=0/Alpha=60/'-e's/Beta=0/Beta=30/'tmpfile.pov
povray Width=480 Height=360+Itmpfile.pov+Ofile\u 60\u 30.png
我知道,这不应该太难,但由于某种原因,我自己无法解决


很抱歉用我的新手问题来打扰你

将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

下面是一个棘手的bash攻击,但它有助于将两个嵌套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 - -)
读取x y时
;做
sed-e's/Alpha=0/Alpha='$x'/'-e's/Beta=0/Beta='$y'/''tmpfile${x}$y.pov“

完成<您可能的意思是
“s/Alpha=0/Alpha=x/”
编辑您的问题,以显示给定x和y值的预期输出的完整集合,因为不清楚您是否希望输出包含这两个值的所有可能组合,或者它们是否应该一对一匹配,甚至你所说的
x=0:30:180
以及y=0:30:90
的意思也不清楚。你是从零开始,同时递增30,但在180处停止x,在90处停止y还是其他什么,这些值是如何相互关联的?谢谢,它就像一个符咒!我不使用不同的输出文件,因为我会在所有渲染完成后清理它们。我认为${fn}使用
$x_$y
时有问题。它试图读取
$x
,因此我将其更改为
${x}{y}
。我用一个包含
Alpha=0
Beta=0
的简单文件尝试了sed。但是我忘了第一个
-e
。很抱歉现在它可以工作了。我使用的shell没有这些数字功能
{0..30..180}
。所以我学会了喜欢seq。对于这个例子来说,这并不重要,但是for循环的运行速度大约是读取大数字的速度的2倍。
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 - -)