Bash 如何将文件逐行导入多个读取变量?

Bash 如何将文件逐行导入多个读取变量?,bash,Bash,我有一个包含两列信息的文件: box1 a1 box2 a2 我试图逐行将此文件读入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; do

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

box1 a1
box2 a2
我试图逐行将此文件读入
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
当我期待以下结果时:

box1 a1 box2 a2
box1 a1
box2 a1

如何解决此问题?

通过管道进入
读取
命令会导致在子shell中设置变量,从而使其他代码无法访问这些变量(实际上,它们已消失)。不过,在这种情况下,您甚至不需要
for
循环或第二个
read
命令:

while read -r a b; do
    echo "$a" "$b"
done < text.txt
读取时-r a b;做
回显“$a”“$b”
完成
Bingo!那很有魅力。。谢谢你的解释,它为我澄清了一切。(@chepner和@Dave Jarvis..谢谢!)如果您的输入中可以有
`参数,请不要忘记使用
-r`参数来读取。@jfgagne,我研究了-r,在oracle文档中发现了以下内容—“默认情况下,除非指定了-r选项,否则反斜杠(\)将充当转义字符。”这是您的意思吗?@mlebel:yes,您需要使用
-r
,因为如果您有一个像
box1 foo\nbar
这样的输入行,而没有
-r
,则会松开“`”。@snapfractalpop:您是对的,文本被损坏了。原始文本是:如果您可以在输入中使用-r参数,请不要忘记使用-r参数来阅读,是的,您需要使用-r,因为如果您有一个像
box1 foonbar
这样的输入行,而没有-r,那么您将在注释的格式设置中使用-r和-r。这里的一般规则是,如果使用
read
,则可能需要
-r
。使用和不使用
-r
,以下将给出不同的结果:
echo“box1 foonbar”|{read-r txt;echo“$txt”}