1

我只是想连接两个字符串变量,但输出以某种方式反转。有人能告诉我为什么吗?谢谢!!

我的外壳脚本:

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
4

2 回答 2

5

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

echo ${HEADER/$'\r'/}
于 2013-10-30T13:44:00.043 回答
0

如果您只想要文件的第一行,只需执行以下操作:

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

您的文件似乎有 dos 行结尾。正如 choroba 的回答中提到的那样,您可以像他向您展示的那样删除这个愚蠢的\r(又名)。^M更好的是完全使用例如dos2unix实用程序转换您的文件,甚至使用明确的适当IFSwith 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"

甚至替换echoprintf

printf "header: %s\n" "$header"
于 2013-10-30T14:24:41.983 回答