使用字符串文字连接从文件读取的字符串会产生混乱的输出

时间:2015-04-30 04:21:27

标签: string macos bash concatenation

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

#!/bin/bash
INPUT="filelist.txt"

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

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

Filelist.txt中

5
8
15
67
...

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

HELLO1WORLD
HELLO2WORLD
HELLO3WORLD
HELLO4WORLD

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

WORLD5
WORLD8
WORLD15
WORLD67

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

How to concatenate strings in bash | Bash variables concatenation | concat string in a shell script

1 个答案:

答案 0 :(得分:1)

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

问题是在Windows中创建了filelist.txt。这意味着它具有CRLF行结尾,而OSX(像其他类Unix环境一样)期望LF只有行结尾。 (点击此处:Difference between CR LF, LF and CR line break types?

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

 #!/bin/bash
INPUTFILE="filelist.txt"
INPUT=$(perl -pe 's/\r\n|\n|\r/\n/g' "$INPUTFILE")

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

问题已在Bash: Concatenating strings fails when read from certain files

以不同的形式提出