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

sh/bash/dash/ksh/zsh等Shell脚本
回复
perseawe
帖子: 4
注册时间: 2011-08-05 21:00

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

#1

帖子 perseawe » 2011-08-05 21:07

代码: 全选

#!/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后面的语句...
新手求救应该怎么办....
头像
wiewi
帖子: 628
注册时间: 2008-11-20 22:50
系统: ArchLinux

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

#2

帖子 wiewi » 2011-08-05 21:14

if [ "` diff ./test.out ./test2.out`"==" " ];
判断条件后面的" "中间不要有空格,如果diff的两个文件相同,输出是空,不是空格,另外可以用 -n / -z 判断是否为空
===我的小窝===
无聊吗?点我吧,楼主迫切期待你的光临~~
又一个轮子
------------------------------------
这年头,没有1000贴都不好意思见人了
------------------------------------
献丑不如藏拙
------------
头像
cjxgm
帖子: 1952
注册时间: 2010-04-23 20:40
系统: Arch Linux
来自: 浙江·杭州
联系:

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

#3

帖子 cjxgm » 2011-08-05 21:20

== 两边要有空格!

代码: 全选

 if [ "`diff ./test.out ./test2.out`" == "" ];
Clanjor Prods. | Develop for Developers. (C++, Lua) | 作曲编曲 | 实时渲染引擎
perseawe
帖子: 4
注册时间: 2011-08-05 21:00

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

#4

帖子 perseawe » 2011-08-05 21:23

谢谢上面两位大神,我果然是个半秃....
还是脚本写的不够熟练,但是觉得ubuntu真是太好用了,特别是用GEANY写程序,真心好用。
头像
wiewi
帖子: 628
注册时间: 2008-11-20 22:50
系统: ArchLinux

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

#5

帖子 wiewi » 2011-08-05 21:28

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]: 没有那个文件或目录
===我的小窝===
无聊吗?点我吧,楼主迫切期待你的光临~~
又一个轮子
------------------------------------
这年头,没有1000贴都不好意思见人了
------------------------------------
献丑不如藏拙
------------
perseawe
帖子: 4
注册时间: 2011-08-05 21:00

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

#6

帖子 perseawe » 2011-08-05 21:59

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后面的...
头像
wiewi
帖子: 628
注册时间: 2008-11-20 22:50
系统: ArchLinux

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

#7

帖子 wiewi » 2011-08-05 22:06

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)
记得以前学的时候,书上讲是应该有空格的,我是看到楼主原本的代码等号两边没有空格,在自己这边试了试竟然可以运行
===我的小窝===
无聊吗?点我吧,楼主迫切期待你的光临~~
又一个轮子
------------------------------------
这年头,没有1000贴都不好意思见人了
------------------------------------
献丑不如藏拙
------------
fnan
帖子: 919
注册时间: 2009-07-01 22:04

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

#8

帖子 fnan » 2011-08-06 2:42

==两边必须有空格,否则成字符串拼接了,永远为真。
条件可以写成 if [ ! "`diff ./test.out ./test2.out`" ]; #意思是: 如果空就。。。。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
MaskRay
帖子: 61
注册时间: 2010-04-29 22:00
系统: Gentoo Linux ~amd64
联系:

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

#9

帖子 MaskRay » 2011-08-06 11:42

代码: 全选

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
perseawe
帖子: 4
注册时间: 2011-08-05 21:00

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

#10

帖子 perseawe » 2011-08-06 15:52

对...像LS这样写更好...
fnan
帖子: 919
注册时间: 2009-07-01 22:04

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

#11

帖子 fnan » 2011-08-07 21:50

另一种循环简单方法:
for i in {1..10};do;done
for i in data/a.*; do echo $i ${i/%in/out}; done
按lz的脚本,要先运行三个文件,得到两个文件,重复十次,那么这个是做什么的?
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
回复