天天看點

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 

文法檢測是沒問題的,但是執行的時候,就亂七八糟的。

<a href="http://blog.51cto.com/attachment/201206/123731532.jpg" target="_blank"></a>

上面最後一個錯是因為exit0沒有空格。看sed的結果是OK的,但是變量的内容就亂七八糟,讓人很頭痛。看下輸出的結果

cat的結果很無語,指令提示符和結果重合了,看檔案的内容,發現後面有個 ^M,這應該是DOS格式檔案的換行符,LINUX裡面的換行符應該是$才對。檢視下檔案格式發現腳本的是UNIX。但是再執行,還是同樣的問題。然後我就把腳本手動的在LINUX裡面輸入了一遍,格式應該不會有問題了,但是還是同樣的問題。

今天突然靈機一動,會不會是.txt檔案格式的問題,而不是腳本格式的問題呢。是以試了一下

VI打開之後,在指令模式下,使用指令 set ff? 可以檢視到檔案格式

<a href="http://blog.51cto.com/attachment/201206/131850368.jpg" target="_blank"></a>

格式确實是dos,然後使用指令改一下

set ff=unix

<a href="http://blog.51cto.com/attachment/201206/132035666.jpg" target="_blank"></a>

把兩個全改了,然後再執行腳本,一切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 

+ 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' 

+ 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

繼續閱讀