如何逐行将文件传输到多个读取变量中?

mle*_*bel 16 bash

我有一个包含两列信息的文件:

box1 a1
box2 a2
Run Code Online (Sandbox Code Playgroud)

我正在尝试逐行读取此文件read并将每个行项目放入变量中.

在第一遍,$a将包含box1$b将包含a1.

在第二遍,$a将包含box2,$b并将包含a2,等.

我用来尝试实现的代码示例如下:

for i in text.txt; do
    while read line; do
        echo $line | read a b;
    done < text.txt;
    echo $a $b;
done
Run Code Online (Sandbox Code Playgroud)

这给了我以下结果:

box1 a1 box2 a2
Run Code Online (Sandbox Code Playgroud)

当我预期以下结果时:

box1 a1
box2 a1
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个问题?

che*_*ner 45

管道化read命令会导致变量在子shell中设置,这使得它们无法访问(事实上,它们已经消失)到代码的其余部分.但是,在这种情况下,您甚至不需要for循环或第二个read命令:

while read -r a b; do
    echo "$a" "$b"
done < text.txt
Run Code Online (Sandbox Code Playgroud)

  • @snapfractalpop:你是对的,文本被弄乱了。原始文本为:**如果您可以在输入中包含&lt;反斜杠&gt;,请不要忘记使用-r参数来读取**和* **是的,您需要使用-r,因为如果您有输入行,例如`box1 foo &lt;backslash&gt; nbar`,不带-r,您将使用&lt;backslash&gt;和-r周围的反引号松开&lt;backslash&gt; **以格式化注释。这里的一般规则是,如果您使用`read`,则可能需要`-r`。使用和不使用-r,以下结果将不同:`echo“ box1 foo &lt;backslash&gt; nbar” | {阅读-r txt; 回显“ $ txt”;}`。 (2认同)