2010-03-07 158 views
0

我写一个简单的UNIX shell脚本:UNIX shell脚本:UDV

#!/bin/bash                 

# abort the script if a command fails 
set -e 

# abort the script if an unitialized shell variable is used 
set -u 

i = 0; 
while [$i -l 1] 
do 
    src/meshpro input/martini.off video/noise/image$i.off -noise $i 
    src/meshview video/noise/image$i.off -output_image video/noise/image$i.jpg -exit_immediately 
    i='expr $i + 0.1' 
done 

当我尝试运行该脚本,我得到以下错误:line 14: i: command not found。我使用了一个教程来应用于我的代码。任何建议我做错了什么?

回答

2

不要把空格周围等号,你不需要分号:

i=0 

此外,你必须在脚本不少其他错误。

+0

我是否允许增加一个非整数值的东西,就像我正在处理变量i一样? – Myx 2010-03-07 23:03:17

+0

是的,但不适用于'expr'。试试'bc'。 – 2010-03-07 23:05:07

+0

谢谢=)我试过bc(i ='bc $ i + 0.01'),但是我得到了第10行:[:while while循环的第二次运行时出现太多参数 错误。 – Myx 2010-03-07 23:12:16

2

空间伤害。把

i=0; 

i = 0; 

用空格我被解释为命令,而不是assignement。

+0

代码中还有其他间距问题 - 分号不是必需的。 – 2010-03-07 23:45:15

+2

没有必要是不同的错误,并在一次的错误:) – 2010-03-08 00:15:44

2

如果使用正常分配,不能有空格,所以你需要:

i=0 

(注意,分号是不必要的)。如果您确实需要格式良好的表达式,则可以使用:

((i = 0)) 

声明。我也会用它来代替expr,因为expr是一个外部命令,它具有创建进程的所有成本(对于仅创建少量外部进程的快速和肮脏的脚本,这通常不重要,但是,如果发现它发生很多事情,你可以获得非常不错的表现改善)。

不幸的是,它并不像浮点,但你可以很容易地模仿它在你的情况,因为你的号码只是从0.0通过0.9(即,只有小数部分的变化)范围:

((i = i + 1)) 

和运行它从0到9,修改其他行以适应新的范围。

我检查的唯一的另一件事是:

while [$i -l 1] 

我觉得[被视为一个命令,所以你可能需要空间(和你肯定需要一个真正的比较操作):

while [ $i -lt 1 ] 

而且[通常也是一个外部程序,我更喜欢bash内置[[

搭售所有这些元素结合在一起:

#!/bin/bash                 
set -e 
set -u 

((i = 0)) 
while [[ $i -lt 10 ]] ; do 
    src/meshpro input/martini.off video/noise/image0.$i.off -noise 0.$i 
    src/meshview video/noise/image$i.off -output_image \ 
     video/noise/image0.$i.jpg -exit_immediately 
    ((i = i + 1)) 
done 

你会发现与以前的零文件输出的差异会一直image0.off与其他image0.X.off,而现在它的image0.0.off。我认为这也是有益的,因为它可以让所有文件的格式完全相同。

如果你不同意,那将是一件简单的事情添加:

mv video/noise/image0.0.jpg video/noise/image0.jpg 

到脚本的结尾。

+0

回复:[vs [[和[作为一个命令:风格明智,我真的更喜欢使用'测试''''。在测试$ i -lt 1时,没有人会写错'但''while'$ i -lt 1''似乎是经常犯的错误。附注:[和测试已经很长一段时间内建立了bash。 – 2010-03-08 17:05:30

0

expr是错误的。 AFAIK它不处理十进制。而且i = 0也是错误的。 =标志周围没有空间。

#!/bin/bash                 
set -e 
set -u 
i=0; 
while true 
do 
    src/meshpro input/martini.off video/noise/image$i.off -noise $i 
    src/meshview video/noise/image$i.off -output_image video/noise/image$i.jpg -exit_immediately 
    i=$(echo "scale=2;$i + 0.1"|bc) 
    case $i in 1.*) break ; esac 
done