分页: 1 / 1

脚本中IF判断语句的几个问题

发表于 : 2011-08-05 21:07
perseawe

代码: 全选

#!/bin/bash
for num in 1 2 3 4 5 6 7 8 9 10
do
	./testa
	./testb
	./testc
	echo "Running $num"
	if [ "` diff ./test.out ./test2.out`"=="" ];
	  then echo "$num is OK"
	  else break
	fi
done
我写了这么一个脚本,用意是运行./testa得到一个文件后分别用./testb和./testc去处理得到./test.out和./test2.out,然后使用条件判断语句来判断是否相同,如果相同就在屏幕上打印一个Ok语句,否则就跳出。
但是我在测试的时候发现无论怎么样,它都仅执行then后面的语句...
新手求救应该怎么办....

Re: 脚本中IF判断语句的几个问题

发表于 : 2011-08-05 21:14
wiewi
if [ "` diff ./test.out ./test2.out`"==" " ];
判断条件后面的" "中间不要有空格,如果diff的两个文件相同,输出是空,不是空格,另外可以用 -n / -z 判断是否为空

Re: 脚本中IF判断语句的几个问题

发表于 : 2011-08-05 21:20
cjxgm
== 两边要有空格!

代码: 全选

 if [ "`diff ./test.out ./test2.out`" == "" ];

Re: 脚本中IF判断语句的几个问题

发表于 : 2011-08-05 21:23
perseawe
谢谢上面两位大神,我果然是个半秃....
还是脚本写的不够熟练,但是觉得ubuntu真是太好用了,特别是用GEANY写程序,真心好用。

Re: 脚本中IF判断语句的几个问题

发表于 : 2011-08-05 21:28
wiewi
cjxgm 写了:== 两边要有空格!

代码: 全选

 if [ "`diff ./test.out ./test2.out`" == "" ];
==两边的不要可以,但是[ 右边的和 ] 左边的空格必须有
[liwei@Arch ~] $ if [ "$HOME"='/home/liwei' ];then echo "OK"; fi
OK
[liwei@Arch ~] $ if ["$HOME"='/home/liwei'];then echo "OK"; fi
bash: [/home/liwei=/home/liwei]: 没有那个文件或目录

Re: 脚本中IF判断语句的几个问题

发表于 : 2011-08-05 21:59
perseawe
wiewi 写了:
cjxgm 写了:== 两边要有空格!

代码: 全选

 if [ "`diff ./test.out ./test2.out`" == "" ];
==两边的不要可以,但是[ 右边的和 ] 左边的空格必须有
[liwei@Arch ~] $ if [ "$HOME"='/home/liwei' ];then echo "OK"; fi
OK
[liwei@Arch ~] $ if ["$HOME"='/home/liwei'];then echo "OK"; fi
bash: [/home/liwei=/home/liwei]: 没有那个文件或目录
在11.04下测试,==两边必须要有空格,否则就仅执行then后面的...

Re: 脚本中IF判断语句的几个问题

发表于 : 2011-08-05 22:06
wiewi
perseawe 写了:
wiewi 写了:
cjxgm 写了:== 两边要有空格!

代码: 全选

 if [ "`diff ./test.out ./test2.out`" == "" ];
==两边的不要可以,但是[ 右边的和 ] 左边的空格必须有
[liwei@Arch ~] $ if [ "$HOME"='/home/liwei' ];then echo "OK"; fi
OK
[liwei@Arch ~] $ if ["$HOME"='/home/liwei'];then echo "OK"; fi
bash: [/home/liwei=/home/liwei]: 没有那个文件或目录
在11.04下测试,==两边必须要有空格,否则就仅执行then后面的...
不知道,我是arch,bash 4.2.10(2)-release (i686-pc-linux-gnu)
记得以前学的时候,书上讲是应该有空格的,我是看到楼主原本的代码等号两边没有空格,在自己这边试了试竟然可以运行

Re: 脚本中IF判断语句的几个问题

发表于 : 2011-08-06 2:42
fnan
==两边必须有空格,否则成字符串拼接了,永远为真。
条件可以写成 if [ ! "`diff ./test.out ./test2.out`" ]; #意思是: 如果空就。。。。

Re: 脚本中IF判断语句的几个问题

发表于 : 2011-08-06 11:42
MaskRay

代码: 全选

if diff -q file1 file2; then
    echo identical
fi
更好吧,如果不想看到错误,请用 > /dev/null

还有你的循环,写全测试数据是很烦的

代码: 全选

for ((i=0;i<5;i++)); do done
更简单

更加灵活的方式是:

代码: 全选

for i in data/a.*; do echo $i ${i/%in/out}; done

Re: 脚本中IF判断语句的几个问题

发表于 : 2011-08-06 15:52
perseawe
对...像LS这样写更好...

Re: 脚本中IF判断语句的几个问题

发表于 : 2011-08-07 21:50
fnan
另一种循环简单方法:
for i in {1..10};do;done
for i in data/a.*; do echo $i ${i/%in/out}; done
按lz的脚本,要先运行三个文件,得到两个文件,重复十次,那么这个是做什么的?