2017-02-11 44 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的文件讀取。

相關問題