2013-10-30 15 views
0

我只是想連接兩個字符串變量,但輸出是以某種方式反轉。有人會讓我知道爲什麼嗎?謝謝!!Shell腳本反向兩個串聯變量?

我的shell腳本:

HEADER=`cat header-cp-match-src-file.csv` 
echo header: $HEADER 
HEADER="$HEADER,Hello,123456" 
echo header: $HEADER 

輸出:

header: good_description,tranx count 
,Hello,123456description,tranx count 

第一行是正確的,但最終的輸出沒有"header:"",Hello,123456"去的前串。

========== ==========解決方案

文件header-cp-match-src-file.csv原本是從Windows包膜,所以它包含了\r,根據建議,它刪除\r後,現在工作正常。謝謝!!

HEADER=`cat header-cp-match-src-file.csv` 
echo header: $HEADER 
HEADER=${HEADER/$'\r'/} 
HEADER="$HEADER,KEVIN,123456" 
echo header: $HEADER 
+2

什麼是你想要做什麼呢? (請描述問題Y,而不是問題X,當你試圖解決Z相信這將最終解決Y時遇到)。 –

+0

輸出看起來並不準確 - 至少第二行應該在其中包含「header:」和「good」這兩個字詞......您是否已將EXACT輸入和輸出複製到您的問題中? – Magnus

+1

'header-cp-match-src-file.csv'具有DOS行尾。回車在第一次被設置時保留爲「HEADER」的最後一個字符;第二次打印時,它會在行首開始打印',Hello,123456',並覆蓋字符串的第一部分。 – chepner

回答

4

第一個變量可能在最後包含\r(MSWin行的一部分)。嘗試刪除它。

echo ${HEADER/$'\r'/} 
+0

非常感謝你!這正是問題和你的解決方案搖滾! – Kevin

+0

感謝隊友,我會死的,並沒有弄清楚這個問題......很難調試這樣的東西!很長時間的計算器! – Stef

0

如果你只希望你的文件的第一行,只是做:

read HEADER < header-cp-match-src-file.csv 

看來你的文件具有DOS行結束。你可以像choroba的回答中提到的那樣,在他向你展示的時候刪除這個愚蠢的\r(又名^M)。更重要的是將完全轉換您的文件中使用,例如,dos2unix效用,甚至使用一個明確的適當IFSread

IFS+=$'\r' read HEADER < header-cp-match-src-file.csv 

除此之外:不使用大寫變量名(你都從哪裏得到這個習慣從???),不要用反引號,用$(...)代替。例如,你的第一行會更好看作爲

header=$(cat header-cp-match-src-file.csv) 

甚至更​​好:

header=$(< header-cp-match-src-file.csv) 

,因爲它不會在外部cat叉。

並使用更多引號!您的腳本會好得多寫爲:

IFS+=$'\r' read header < header-cp-match-src-file.csv 
echo "header: $header" 
header+="KEVIN,123456" 
echo "header: $header" 

甚至更​​換echoprintf

printf "header: %s\n" "$header"