問題描述:
shell指令碼從配置檔案中讀取ip,然後對讀取ip進行處理,但是碰到乙個問題,讀取的ip,總是不正確。指令碼很簡單。將指令碼與配置檔案簡化後發現乙個奇怪的問題, 其實問題比較簡單,只是沒有注意到,導致分析了很長的時間,現記錄下來。
bash 指令碼如下
1
2
3
4
5
6
7
#
!/bin/bash
cur
=
`pwd`
filelist
=
`cat $/t
1
.txt `
for
line in $
do
echo
"line **********=#$##"
done
其t1.txt的值也比較簡單
[ root@hadoop220 script]# cat t1.txt
abc [
root@hadoop220 script]#
執行指令碼:
[ root@hadoop220 script]# ./test1.sh
##ne **********=#abc ------本來應該列印在abc後面的#,結果跑到前面去了。 [
root@hadoop220 script]#
分析:之前懷疑讀取的
$中包含了其它不可見的字元。 剛開始使用ultraedit檢視它的十六進製制, 也沒有發現有異常的情況。 在linux下面使用 vi開啟t1.txt的時候,偶然發現它是dos格式
嘗試使用dos2unix轉換了一下,測試ok
原因:當檔案是dos格式的時候,
[ root@hadoop220 script]# hexdump t1.txt
0000000 6261 0d63 000a
b a crc lf
0000005
換**眼可讀取字元,應該就是:abc[cr][lf] , cr
而當檔案是unix格式的時候:
[ root@hadoop220 script]# hexdump t1.txt
0000000 6261 0a63
0000004
換成可讀字元,就是: abc[lf]
到網上檢視了下:
dos和windows採用回車+換行cr/lf表示下一行,
而unix/linux採用換行符lf表示下一行,
蘋果機(mac os系統)則採用回車符cr表示下一行.
cr用符號'\r'表示, 十進位制ascii**是13, 十六進製制**為0x0d;
lf使用'\n'符號表示, ascii**是10, 十六制為0x0a.
因此當文字為dos格式的時候:其儲存的字元就是abc\r\n, 至此,我們就可以發現相對於unix格式的檔案,dos格式檔案多了乙個\r,而這個\r就是導致問題的出現。
[ root@hadoop220 script]# echo -e "abc\rmn"
mnc [
root@hadoop220 script]#
最後附上從網上
找到的關於echo -e的幾種特殊字元的處理
echo -e 處理特殊字元
若字串中出現以下字元,則特別加以處理,而不會將它當成一般文字輸出:
\a 發出警告聲;
\b 刪除前乙個字元;
\c 最後不加上換行符號;
\f 換行但游標仍舊停留在原來的位置;
\n 換行且游標移至行首;
\r 游標移至行首,但不換行;
\t 插入tab;
\v 與\f相同;
\\ 插入\字元;
\nnn 插入nnn(八進位制)所代表的ascii字元;
由return引出的思考
public class test public static int get finally 返回的結果是2。try中的return 語句呼叫的函式先於finally 中呼叫的函式執行,也就是說return 語句先執行,finally 語句後執行,所以,返回的結果是2 return 並不是讓函式馬...
由顯示 隱藏引出的CSSBug
的就是想用css來控制某段文字的顯示與隱藏。起初我採用了下面的 令人不可思議的是,它們在我的ie6.0上居然沒有任何反應,大家不信可以親自試驗一下。link我是隱藏內容 我仔仔細細地檢查了一遍 實在找不到什麼毛病來。沒有辦法,我只能像平時查錯糾錯一樣,試著改改css裡的 當我改變了hover偽類鏈結...
由 128的補碼引出的思考
1.補碼 two s complement 在計算機系統 中,數值一律用補碼來表示 儲存 主要原因 使用補碼,可以將符號位和其它位統一處理 同時,減法也可按加法來處理。另外,兩個用補碼表示的數相加時,如果最高位 符號位 有進製,則進製被捨棄。補碼與原碼 的轉換過程幾乎是相同的。2.一般的說法是負數的...