2013-03-15 26 views
10

我有一个包含两列信息的文件:管道文件一行一行到多个读变量

box1 a1 
box2 a2 

我试图逐行读取这个文件到线读取,并有各行的项目放变成一个变量

第一次通过时,$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 

我该如何解决这个问题?

回答

27

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

while read -r a b; do 
    echo $a $b 
done < text.txt 
+0

宾果!这就像一个魅力..谢谢你的解释,它为我清除了事情。 (@chepner和@Dave Jarvis ..谢谢!) – mlebel 2013-03-15 22:44:45

+0

如果你可以在你的输入中有'\',不要忘记使用'-r'参数来读取。 – jfg956 2013-03-16 01:29:31

+0

@jfgagne,我研究了-r,并在oracle文档中找到了以下内容 - “默认情况下,除非指定了-r选项,否则反斜杠(\\)充当转义字符。”这是你的意思吗? – mlebel 2013-03-16 23:53:31

相关问题