我必须提到我是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
更确切地说,在一段时间条件下
但是我的理智已经消失了。。我真的很感谢您的帮助 非常感谢:)
答案 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 <&0
和0< tmpp1.txt
。 (1和2分别是标准输出和标准错误,这就是为什么从3开始附加文件描述符的原因。)