sh/bash/dash/ksh/zsh等Shell脚本
-
perseawe
- 帖子: 4
- 注册时间: 2011-08-05 21:00
#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
#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
- 来自: 浙江·杭州
-
联系:
#3
帖子
由 cjxgm » 2011-08-05 21:20
== 两边要有空格!
代码: 全选
if [ "`diff ./test.out ./test2.out`" == "" ];
-
perseawe
- 帖子: 4
- 注册时间: 2011-08-05 21:00
#4
帖子
由 perseawe » 2011-08-05 21:23
谢谢上面两位大神,我果然是个半秃....
还是脚本写的不够熟练,但是觉得ubuntu真是太好用了,特别是用GEANY写程序,真心好用。
-
wiewi
- 帖子: 628
- 注册时间: 2008-11-20 22:50
- 系统: ArchLinux
#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
#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
#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
#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
-
联系:
#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
-
fnan
- 帖子: 919
- 注册时间: 2009-07-01 22:04
#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++强悍,不过可以用。