乙個shell中詭異問題的解決

2021-10-01 15:02:20 字數 2002 閱讀 4872

前兩天上線,同事碰見個shell指令碼的問題,當時場景,異常詭異。

指令碼的判斷邏輯很長,為了方便說明,此處只給出關鍵步驟,

a=`curl ...` (期待返回值是aa)

b=bb

echo $a\$$b (期待輸出是aa$bb,實際輸出$bb)

echo $b\$$a (實際輸出bb$aa)

其中,變數a是通過curl以及一系列管道操作擷取的資訊,使用echo列印多個變數的值,非常詭異的是,出現了一些字元沒有出現或者從首字元處出現了疊寫、相互覆蓋、覆寫的現象,例如$a\$$b,$b重疊到首字母進行覆蓋輸出,甚至相同的兩個變數,互換順序,結果顯示不同。

這個時候,sh命令的-x這個引數,就開始起作用了,他的意思是顯示shell執行過程中的命令,通過執行,我們看到了區別,變數a的值,不是期待的aa,而是"aa\r",

+ a='aa\r'
不要小瞧\r,我們知道windows下的空行是\r\n,,但是linux下是\n,沒有識別\r。

\n是lf或ascii中的0x0a(10),\r是cr或ascii中的0x0d(13)。

問題來了,lf和cr是什麼?這就要講講「回車」(carriage return)和「換行」(line feed)這兩個概念的來歷和區別了。

在計算機還沒有出現之前,有一種叫做電傳打字機(teletype model 33)的玩意,每秒鐘可以打10個字元。但是有乙個問題,就是打完一行換行的時候,要用去0.2秒,正好可以打兩個字元。要是在這0.2秒裡面,又有新的字元傳過來,那麼這個字元將丟失。

於是,研製人員想了個辦法解決這個問題,就是在每行後面加兩個表示結束的字元。乙個叫做「回車」,告訴打字機把列印頭定位在左邊界,另乙個叫做「換行」,告訴打字機把紙向下移一行。

這就是「換行」和「回車」的來歷,從它們的英語名字上也可以看出一二,cr就是carriage return的縮寫,lf是line feed的縮寫。

後來,計算機發明了,這兩個概念也就被般到了計算機上。那時,儲存器很貴,一些科學家認為在每行結尾加兩個字元太浪費了,加乙個就可以。於是,就出現了分歧。

unix系統裡,每行結尾只有「《換行》」,即「\n」,windows系統裡面,每行結尾是「《換行》《回車》」,即「\n\r」,mac系統裡,每行結尾是「《回車》」。乙個直接後果是,unix/mac系統下的檔案在windows裡開啟的話,所有文字會變成一行,而windows裡的檔案在unix/mac下開啟的話,在每行的結尾可能會多出乙個^m符號。

因此,\r就是return回到本行行首,這就會把這一行以前的輸出覆蓋掉。

$a\$$b,其中$a='aa\r',所以$b重疊到首字母進行覆蓋輸出,就可以解釋了。

我們用下面的指令碼模擬下,可能會更清晰,

#!/bin/bash

a='se\r'

b='sa'

echo -e $a$b

echo -e $a\$$b

echo -e $b$a

echo -e $b\$$a

可以看到變數a='se\r',然後使用echo -e引數,他的作用是enable interpretation of backslash escapes,即啟用反斜槓轉義功能,

+ a='se\r'

+ b=sa

+ echo -e 'se\rsa'

sa+ echo -e 'se\r$sa'

$sa+ echo -e 'sase\r'

sase

+ echo -e 'sa$se\r'

sa$se

因為\r的存在,$a$b輸出的是$b的值,如果是$b$a,因為\r放在後面,並未影響,所以是正確的$b$a。

既然明確了問題,解決就很清晰了,可以在curl加個tr -d,就達到了刪除\r,保證對的換行,

a=`curl ... | tr -d '\r'`
在科學技術上,任何你看到的現象都會有他的原因,所謂存在即合理,詭異的事情,還是因為沒看到本質,其實根本不詭異。

python 乙個詭異問題的解決

檔案上傳中,需要驗證銀行卡號,於是寫正則如下 regex r d 然後上傳到伺服器,結果re.match regex,file field 為none。在notpad 中驗證正則能夠match,又在python命令列中試了一下 import re re.match r d 6228410770613...

Struts2乙個詭異問題的解決

專案中使用struts2.像很多問題一樣,剛開始出現的時候,覺得很詭異,難以入手 解決掉之後,就知道其實很簡單了。前幾天遇到乙個問題,在某action類中定義了乙個名為success的字串變數,正常情況下某actino1完成時,success的值應該是 true 結果發現有些情況下,action1成...

loadrunner 乙個詭異問題

最近使用loadrunner壓測乙個專案的時候,發現tps波動巨大 且平均值較低。使用jmeter壓測則沒有這個問題。經過多方排查發現乙個讓人極度費解的原因 原指令碼 指令碼其他 web submit data aaa action 此處為密文鏈結 事務判斷邏輯等 tps圖如下 修改後的 指令碼其他...