Bash逐行读取。无法合并变量和字符串,已附加变量

时间:2018-11-12 01:23:33

标签: bash

我收到一些非常奇怪的行为,试图读取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,但我上面发布的内容是我似乎遇到的问题的一个简单示例。

2 个答案:

答案 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