本文主要是介绍Bash脚本莫名奇妙的错误,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
由于工作需要,写了一个脚本,该脚本的功能是实现:
有两个.txt文件,里面存放了一些域名,然后从这两个.txt文件里面,随机取出一个域名,写入到shiting.htm和xiazai.htm文件里面。
脚本写好了,测了语法,没问题,在虚拟机里面也测试通过的,没问题。可是一拷贝到生产环境中,就出了大问题。纠结了我两天,现在终于得到了解决,现在总结以下,以免以后再犯同样的错误。
脚本如下:
- #!/bin/bash
- # author: honway.liu
- # date: 2012-06-01
- # define location file
- yyxz=/data/cdn/xiazai.txt
- yyst=/data/cdn/shiting.txt
- #xiazai=/data/api/xiazai.htm
- #shiting=/data/api/shiting.htm
- xiazai=/tmp/xiazai.htm
- shiting=/tmp/shiting.htm
- log=/tmp
- # xiazai & shiting file line number
- xznm=$(wc -l $yyxz|awk '{print $1}')
- stnm=$(wc -l $yyst|awk '{print $1}')
- # random for xiazai & shiting
- down=$[$RANDOM%$xznm+1]
- listen=$[$RANDOM%$stnm+1]
- # get xiazai & shiting domain name
- xzym=$(sed -n ${down}p $yyxz)
- stym=$(sed -n ${listen}p $yyst)
- # write domain name into htm files.
- echo -n $xzym > $xiazai
- echo -n $stym > $shiting
- # out put logs
- echo "The $xzym at `date +'%F %T'` be provided" >>/$log/xiazai_domain.log
- echo "The $stym at `date +'%F %T'` be provided" >>/$log/shiting_domain.log
- exit 0
语法检测是没问题的,但是执行的时候,就乱七八糟的。
上面最后一个错是因为exit0没有空格。看sed的结果是OK的,但是变量的内容就乱七八糟,让人很头痛。看下输出的结果
cat的结果很无语,命令提示符和结果重合了,看文件的内容,发现后面有个 ^M,这应该是DOS格式文件的换行符,LINUX里面的换行符应该是$才对。查看下文件格式发现脚本的是UNIX。但是再执行,还是同样的问题。然后我就把脚本手动的在LINUX里面输入了一遍,格式应该不会有问题了,但是还是同样的问题。
今天突然灵机一动,会不会是.txt文件格式的问题,而不是脚本格式的问题呢。所以试了一下
VI打开之后,在命令模式下,使用命令 set ff? 可以查看到文件格式
格式确实是dos,然后使用命令改一下
set ff=unix
把两个全改了,然后再执行脚本,一切OK。
- darling@00057:/tmp$ bash -x 123.sh
- + yyxz=/data/cdn/xiazai.txt
- + yyst=/data/cdn/shiting.txt
- + xiazai=/tmp/xiazai.htm
- + shiting=/tmp/shiting.htm
- + log=/tmp
- ++ wc -l /data/cdn/xiazai.txt
- ++ awk '{print $1}'
- + xznm=10
- ++ wc -l /data/cdn/shiting.txt
- ++ awk '{print $1}'
- + stnm=10
- + down=3
- + listen=3
- ++ sed -n 3p /data/cdn/xiazai.txt
- + xzym=http://nyl.gpix4y.yymommy.com
- ++ sed -n 3p /data/cdn/shiting.txt
- + stym=http://y3ek.otw.hotchanson.com
- + echo -n http://nyl.gpix4y.yymommy.com
- + echo -n http://y3ek.otw.hotchanson.com
- ++ date '+%F %T'
- + echo 'The http://nyl.gpix4y.yymommy.com at 2012-06-07 11:50:40 be provided'
- ++ date '+%F %T'
- + echo 'The http://y3ek.otw.hotchanson.com at 2012-06-07 11:50:40 be provided'
- + exit 0
哎呀我的老天爷,终于搞定了。真不容易,折腾了我几天。
一个文件格式的错误,就能引起脚本运行的精神错乱,哎,吸取教训,以后有什么文件,要在LINXU里面写,拒绝从WIN写好之后,再传入LINUX.
时值2012年高考第一天,祝所有考生都能考出好成绩。
本文转自 gm100861 51CTO博客,原文链接:http://blog.51cto.com/gm100861/891125
这篇关于Bash脚本莫名奇妙的错误的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!