由DOS格式引出的shell指令碼問題

2021-07-09 11:21:07 字數 2146 閱讀 7794

問題描述:

shell指令碼從配置檔案中讀取ip,然後對讀取ip進行處理,但是碰到乙個問題,讀取的ip,總是不正確。指令碼很簡單。將指令碼與配置檔案簡化後發現乙個奇怪的問題, 其實問題比較簡單,只是沒有注意到,導致分析了很長的時間,現記錄下來。

bash 指令碼如下

1

2

3

4

5

6

7

#!/bin/bash

cur=`pwd`

filelist=`cat $/t1.txt `

forline 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.一般的說法是負數的...