使用for循环的bash获取该文件是写在另一个文本文件的文件内容
问题描述:
我试图获取该文件是写在另一个文本文件使用for循环的bash获取该文件是写在另一个文本文件的文件内容
我的计划是文件内容:
for i in $(cat FILE)
do
echo $i
done
我希望结果将是
OBJECT1
OBJECT2
LINE1
LINE2
,但结果只有
aa
bb
该程序不读取AA和BB
的文件名和内容的内容列表如下:
FILE:
aa
bb
AA:
OBJECT1
OBJECT2
bb:
LINE1
LINE2
答
下面是我认为你正在尝试做的事情。
考虑:
$ 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
说明:
-
<FILE
读取文件FILE
和内容重定向到while循环 -
while IFS= read -r fn; do ... done
定义while loop。将每个由CR终止的行读取到fn
。前导和尾随空白的IFS=
prevents the trimming。-r
选项可防止反斜杠解释。 -
|| [[ -n $fn ]]
如果文件FILE
的最后一行没有以\n
终止,则循环继续返回true。如果你知道你的文件有终止,你不需要这部分。 -
cat "$fn"
运行引用文件名为“$ fn”的程序cat
。它需要被引用,以保持文件名不变,如果有名称,如“大file.txt的”
答
试试这个:
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
答
while read LINE; do cat "$LINE" done <FILE
应该工作得很好。所有$(cat)
版本都使用执行外部命令(cat
)的子shell,该命令至少不是最优的。以上使用纯bash循环遍历FILE的每一行和cat
s的文件读取。
用'cat'替换'echo $ i' $我'' – janos
用'[for](http://mywiki.wooledge.org/DontReadLinesWithFor)循环'$(cat FILE)'是不好的,循环。使用[while循环](http://mywiki.wooledge.org/BashFAQ/001) – dawg