1. 程式人生 > >Linux Shell Echo多變數輸出時怪異疊寫現象(某些字串變數中含有\r或\n)

Linux Shell Echo多變數輸出時怪異疊寫現象(某些字串變數中含有\r或\n)

今天利用Linux Shell命令從檔案中擷取一部分文字行資訊 `Cat file | grep someKeyword` 到Shell變數中,然後又用shell字串變數擷取的方法,提取文字行內更準確的字元資訊;利用同樣的操作方法,得到多個字串變數資訊,最後再用echo組合多變數輸出所需要的格式資訊,但最終控制檯顯示結果卻發現了怪異現象,一些字元沒有出現或者從首字元處出現了疊寫、相互覆蓋、覆寫的現象!

例如:用Echo命令多變數組合輸出 echo "$var1 $ var2 $ var3",卻意外地只看到var3完整內容和var2部分內容,且var3重疊到首字母進行覆蓋輸出。

調整var1、var2、var3變數的順序後,會得到一些不同,但是由於調整順序並不滿足最終要求(只能是var1..N的順序組合;var1和var2都含有同樣的特殊字元),在最開始費了好一陣子時間,一直參不透到底是因為什麼。

過程中甚至還懷疑到echo -e模式身上上來,初步懷疑到是因為某些特殊字元的原因。不過,這是驢頭不對馬嘴,完全相反。過程中又猜測用echo -n是不是會效果好點,結果依然出現同樣的輸出重疊的現象。

 深入研究下去,用Shell字串長度函式獲得var1、var2、var3字串長度,發現var1、var2的字串長度與實際看到的字元有差異,且差了一個字元!

當時就懷疑到是不是var1、var2中含有\r或\n的隱藏字元,後來用tr -d '\r'和tr -d '\n'去掉字串中的特殊\r、\n字元,發現輸出就正常了。

由此,總結:在echo整體輸出或不換行輸出時,如果輸出變數字串中含有\r或\n的特殊字元,則有可能導致在其後續輸出變數內容會從首字元重新開始重疊輸出,就導致顯示結果上的怪模怪樣了。

初步解釋,echo在這個場景下的行為也是很符合設計的。原則上在echo不換行輸出模式下,輸出字串中要求換行,則echo控制流只能讓輸出流重新回到了當前行的首字元,相當於一次軟回車,這樣就出現了覆寫、覆蓋了!