2012-02-23 36 views
3

下面的程序讀取文件換行符結尾的文本文件,它打算將所有的值(每行)存儲到一個變量,但不保存最後一行。爲什麼?Shell腳本:如何看不與Windows

file.txt的

1 
    2 
    . 
    . 
    . 
    n 

代碼

FileName=file.txt 

if test -f $FileName   # Check if the file exists 
    then 
     while read -r line 
     do  
      fileNamesListStr="$fileNamesListStr $line" 

     done < $FileName 
    fi 

    echo "$fileNamesListStr" // 1 2 3 ..... n-1 (but it should print up to n.) 
+2

請問您的文件以新行結束? – jackrabbit 2012-02-23 06:26:52

+0

@jackrabbit:no。實際上大多數客戶端不知道,他們寫入文件而不以新行結束。因此我正在尋找這樣的解決方案,應該在兩種情況下都能正常工作 – user1010399 2012-02-23 07:54:46

回答

4

不是一行一行讀,爲什麼不一次讀整個文件呢?

[ -f $FileName ] && fileNameListStr=$(tr '\n' ' ' < $FileName) 
+1

+1迄今最優雅的方法! – jackrabbit 2012-02-24 06:31:45

+0

僅僅是出色和非常有效的:) +100 – user1010399 2012-02-27 09:35:20

+0

也是我想給一個通知,如果文件丟失? – user1010399 2012-02-27 09:36:17

3

一個可能的原因是,有錯過的最後一行n後換行。

使用下面的命令來檢查:

tail -1 file.txt 

與以下修正:

echo >> file.txt 

如果你真的需要保留的最後一行沒有換行,我重組了while環這裏。

#!/bin/bash 
FileName=0 
if test -f $FileName ; then 
    while [ 1 ] ; do  
     read -r line 
     if [ -z $line ] ; then 
      break 
     fi 
     fileNamesListStr="$fileNamesListStr $line" 
    done < $FileName 
fi 
echo "$fileNamesListStr" 
+0

感謝您的時間。如果我使用'尾-1 file.txt'則返回最後一行('N')任一文件用新的行結束與否,'回波>> file.txt'末是否文件添加新的空白行新行結束與否。所以我不認爲這對我的情況很有用 – user1010399 2012-02-23 09:58:08

+0

我想先檢查一下,如果文件以新行「不做」結束。 else'echo >> file.txt'。 – user1010399 2012-02-23 09:59:22

1

問題是,當文件沒有以換行符結束時,讀取返回非零值,循環無法繼續。讀取命令仍會讀取數據,但不會處理循環。這意味着你需要在循環之外進行進一步的處理。你也可能想要一個數組而不是空格分隔的字符串。

的FileName = file.txt的

if test -f $FileName   # Check if the file exists 
    then 
     while read -r line 
     do  
      fileNamesListArr+=("$line") 

     done < $FileName 

     [[ -n $line ]] && fileNamesListArr+=("$line") 
fi 

echo "${fileNameListArr[@]}" 

看到 「我的文本文件被破壞!他們缺乏最終的換行符!」這篇文章的部分: http://mywiki.wooledge.org/BashFAQ/001

+0

謝謝jordanm。它在兩種情況下工作或者文件以新行結束或不結束。非常感謝您的時間和您提供的解決方案。 – user1010399 2012-02-27 03:12:07

+0

根據內存空間和訪問存儲的數據,哪一個是高效的'空格分隔字符串Vs數組字符串'。 – user1010399 2012-02-27 03:14:35

+1

@ user1010399我的解決方案的好處是它可以在包含空格的文件中處理文件名,而其他的不能。我不確定RAM的差異,但它很可能可以忽略不計。如果你想減少內存使用量和速度,那麼你使用的是錯誤的語言。 – jordanm 2012-02-27 13:58:42

0

作爲解決方法,在從文本文件讀取之前,可以將新行附加到文件。

echo "\n" >> $file_path 

這將確保以前在文件中的所有行將被讀取。現在可以逐行讀取文件。