bash逐行同时遍历2个文件

时间:2018-11-08 20:13:22

标签: bash while-loop iteration

我必须提到我是bash的新手,因此它的语法目前对我来说是一个巨大的问题

我有什么?

2个文件。例如,

tmpp1.txt

drwxrw-rw-
drwxrw-rw-
-rw-r--r--

tmpp2.txt

drw-rw-rw-
drwxrw-rw-
-rw-r--r--

我想要什么?

同时遍历这两个文件,以便可以逐行比较它们。例如:检查tmpp1.txt第1行上的字符串是否等于tmpp2.txt第1行上的字符串,然后是lin2,line3等

如果字符串不同,则需要说明已更改的内容。

在互联网上阅读了有关此问题的其他几篇文章,并且堆栈本身溢出后,我最终想到了这一点

while read p1 <&tmpp1.txt && read p2 <&tmpp2.txt; do
    if [ "$p1" != "$p2" ]
    then
      echo "A file has had the wrong permission: $p1"
      echo "This has been changed to: $p2"
    fi
done 

此代码给出错误:./folder-stats-2.sh: line 51: tmpp1.txt: ambiguous redirect 更确切地说,在一段时间条件下

但是我的理智已经消失了。。我真的很感谢您的帮助 非常感谢:)

1 个答案:

答案 0 :(得分:0)

该错误是由于使用未定义的运算符<&而不是<引起的。 (<&本身是未定义的,也就是说,您必须指定像<&3这样的文件描述符才能有效。)但是,这将无法完成所需的操作,因为输入文件将是每次重新打开,导致您反复读取每个文件的第一行。

相反,您需要使用两个单独的文件描述符,并在循环中一次打开它们,以便read每次在循环中都继承相同的描述符。

while read p1 && read p2 <&3  && read p3 <&4; do
   ...
done < tmpp1.txt 3< tmpp2.txt 4< tmpp3.txt

<&3告诉read从文件描述符3而不是文件描述符0(标准输入,它的默认值)中读取。

顺便说一句,标准输入始终是文件描述符0。您可以(不必要)写入read p1 <&00< tmpp1.txt。 (1和2分别是标准输出和标准错误,这就是为什么从3开始附加文件描述符的原因。)