关于macos:使用字符串文字从文件读取的串联字符串会创建混乱的输出

Concatenating string read from file with string literals creates jumbled output

我的问题是结果是混乱的。 考虑这个脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash
INPUT="filelist.txt"

i=0;
while read label
do
    i=$[$i+1]
    echo"HELLO${label}WORLD"
done <<< $'1
2
3
4'


i=0;
while read label
do
    i=$[$i+1]
    echo"HELLO${label}WORLD"
done <"$INPUT"

Filelist.txt中

1
2
3
4
5
5
8
15
67
...

第一个循环,具有立即输入(通过我认为称为herestring(<<<运算符)的东西给出预期输出

1
2
3
4
HELLO1WORLD
HELLO2WORLD
HELLO3WORLD
HELLO4WORLD

从文件读取的第二个循环给出以下混乱输出:

1
2
3
4
WORLD5
WORLD8
WORLD15
WORLD67

我试过echo $label:这在两种情况下都按预期工作,但在第二种情况下连接失败,如上所述。 此外,完全相同的代码适用于我的Win 7,git-bash环境。 此问题出现在OSX 10.7 Lion上。

如何在bash中连接字符串
Bash变量连接|
shell脚本中的concat字符串


好吧,正当我即将发布帖子时,解决方案击中了我。 在这里共享,所以其他人可以找到它 - 我花了3个小时来调试它(尽管几乎所有时间都在SO上)所以我看到了解决这个特定(常见)用例的价值。

问题是filelist.txt是在Windows中创建的。 这意味着它具有CRLF行结尾,而OSX(像其他类Unix环境一样)期望LF只有行结尾。 (在此处查看更多内容:CR LF,LF和CR换行符类型之间的区别?)

我在这里用答案在消费之前转换文件。 使用sed我设法只替换最后一行的回车,所以我坚持使用已知枪支并采用perl方法。 最终脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 #!/bin/bash
INPUTFILE="filelist.txt"
INPUT=$(perl -pe 's/

|
|
/
/g'
"$INPUTFILE")

i=0;
while read label
do
    i=$[$i+1]
    echo"HELLO${label}WORLD"
done <<< $'INPUT'

在Bash中以不同的形式询问了问题:从某些文件读取时,连接字符串失败