2017-02-11 55 views
1

我试图获取该文件是写在另一个文本文件使用for循环的bash获取该文件是写在另一个文本文件的文件内容

我的计划是文件内容:

for i in $(cat FILE) 
do 
    echo $i 
done 

我希望结果将是

OBJECT1 
OBJECT2 
LINE1 
LINE2 

,但结果只有

aa 
bb 

该程序不读取AABB

的文件名和内容的内容列表如下:

FILE:

aa 
bb 

AA:

OBJECT1 
OBJECT2 

bb:

LINE1 
LINE2 
+1

用'cat'替换'echo $ i' $我'' – janos

+0

用'[for](http://mywiki.wooledge.org/DontReadLinesWithFor)循环'$(cat FILE)'是不好的,循环。使用[while循环](http://mywiki.wooledge.org/BashFAQ/001) – dawg

回答

3

下面是我认为你正在尝试做的事情。

考虑:

$ cat FILE 
aa 
bb 
$ cat aa 
OBJECT1 
OBJECT2 
$ cat bb 
LINE1 
LINE2 

你可以这样做:

$ while IFS= read -r fn || [[ -n $fn ]]; do cat "$fn"; done <FILE 
OBJECT1 
OBJECT2 
LINE1 
LINE2 

说明:

  1. <FILE读取文件FILE和内容重定向到while循环
  2. while IFS= read -r fn; do ... done定义while loop。将每个由CR终止的行读取到fn。前导和尾随空白的IFS=prevents the trimming-r选项可防止反斜杠解释。
  3. || [[ -n $fn ]]如果文件FILE的最后一行没有以\n终止,则循环继续返回true。如果你知道你的文件有终止,你不需要这部分。
  4. cat "$fn"运行引用文件名为“$ fn”的程序cat。它需要被引用,以保持文件名不变,如果有名称,如“大file.txt的”
+0

[[...]]'部分是为了处理破损的文件。这不应该是必要的。 – chepner

+0

@chepner:欣赏这个事实,将rem! – Inian

+0

@chepner:'|| [[...]]处理最后一行中没有正确终止的文件'\ n'。我经常遇到这种情况。够了,我只是在我的Bash while循环中将该部分用作默认部分。我添加了一个解释... – dawg

-1

试试这个:

for i in $(cat FILE) 
do 
for e in $(cat "$i") 
do 
    echo "$e" 
done 
done 

我想这是你想要的。

+1

1)如果其中一行文件是'*'会怎么样? 2)引用你的变量或将会出现分词和参数扩展3)使用[while循环](http://mywiki.wooledge.org/BashFAQ/001)来读取文件,而不是[for循环](http ://mywiki.wooledge.org/DontReadLinesWithFor)4)用[shellcheck](https://www.shellcheck.net)检查你的Bash脚本, – dawg

0

while read LINE; do cat "$LINE" done <FILE 应该工作得很好。所有$(cat)版本都使用执行外部命令(cat)的子shell,该命令至少不是最优的。以上使用纯bash循环遍历FILE的每一行和cat s的文件读取。

相关问题