我收到一些非常奇怪的行为,试图读取txt文件时我无法弄清。
我有一个看起来像这样的txt文件:
98040520
98041022
98041024
...
然后我有一个bash脚本,其中包含一些基本调试,如下所示:
#!/usr/bin/env bash
while read id; do
test=123
echo "${test}.png"
echo $id
echo "${id}.png"
echo "test${id}.png"
exit
done <myfile.txt
输出为
123.png
98040520
.png
.png98040520
到底是怎么回事?
它可以很好地打印“ 98040520”,但不会打印“ 98040520.png”,它只会打印“ .png”部分,并尝试打印“ test98040520.png”,结果会附加id以创建“ .png98040520”和“测试”一词完全排除了!
我认为这必须与行尾有关(txt文件来自Windows),但是我无法在线找到任何有用的东西。我一直在寻找如何修剪空格或行尾的方式,这可能意味着我一直在寻找错误的东西。
如果不清楚我想做的是获取“ 98040520.png”或更具体地说是filepath=../../path/to/my/dir/98040520.png
,但我上面发布的内容是我似乎遇到的问题的一个简单示例。
答案 0 :(得分:2)
这确实是一个行尾问题(请参阅here,以了解\r
对终端输出的影响)。
您可以在文件中固定结尾,也可以在脚本中固定结尾(tr -d "\r"
将删除\r
的所有实例,以在传递到while循环的文本中产生unix样式的行结尾) :
#!/usr/bin/env bash
cat myfile.txt | tr -d "\r" | while read id; do
test=123
echo "${test}.png"
echo $id
echo "${id}.png"
echo "test${id}.png"
exit
done
使用固定版本将提供预期的输出。
答案 1 :(得分:-1)
您不需要所有引号和大括号。另外,您的while循环中有exit
,您应该摆脱它:
while read id; do
test=123
echo $test.png
echo $id
echo $id.png
echo test$id.png
done <myfile.txt