我的问题是结果是混乱的。考虑一下这个脚本:
#!/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
答案 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
以不同的形式提出