Shell脚本反转两个连接变量?

时间:2013-10-30 13:40:52

标签: string bash shell concatenation

我只想连接两个字符串变量,但输出以某种方式反转。有谁请让我知道为什么?谢谢!

我的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 env,因此它包含\r,基于该建议,它在删除\r后现在可以正常工作。谢谢!

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

2 个答案:

答案 0 :(得分:4)

第一个变量最后可能包含\r(MSWin行的一部分)。尝试删除它。

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

答案 1 :(得分: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"

甚至用echo替换printf

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