我只想连接两个字符串变量,但输出以某种方式反转。有谁请让我知道为什么?谢谢!
我的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
答案 0 :(得分:4)
第一个变量最后可能包含\r
(MSWin行的一部分)。尝试删除它。
echo ${HEADER/$'\r'/}
答案 1 :(得分:0)
如果您只想要文件的第一行,请执行以下操作:
read HEADER < header-cp-match-src-file.csv
您的文件似乎有dos行结尾。你可以像choroba的回答中提到的那样,在他向你展示时删除这个愚蠢的\r
(又名^M
)。更好的方法是使用例如dos2unix
实用程序完全转换文件,甚至使用明确适当的IFS
和read
:
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"