2014-11-06 24 views
2

我有一個簡單的bash腳本,其中文件的內容被複制到文件A,如果行數低於10,則內容被複制到文件B

這裏的代碼:

# File A and B are created before, since I'm in a loop 
# file content is different each time. I add it either to A or B corresponding the matching. 
# I know I could use wc -l directly on the file too but I don't think the problem came from 
# it since i've tested both. 

let nblines=$(cat file | wc -l) 

if [[ $nblines < 10 ]]; then 
    cat file >> A 
else 
    cat file >> B 
fi 

的問題是,我的終端上,並在腳本,但並不總是這樣的工作。我有錯誤的目標文件中的內容文件。這裏我從A和B得到:

# "nombre de ligne" is number of lines 

[email protected]:~$ cat A 
7 nombre de lignes 
7 nombre de lignes 
7 nombre de lignes 
5 nombre de lignes 
5 nombre de lignes 
6 nombre de lignes 
6 nombre de lignes 
6 nombre de lignes 
5 nombre de lignes 
5 nombre de lignes 
76 nombre de lignes 
77 nombre de lignes 
[email protected]:~$ cat B 
114 nombre de lignes 
102 nombre de lignes 
131 nombre de lignes 
121 nombre de lignes 
121 nombre de lignes 
105 nombre de lignes 
105 nombre de lignes 
120 nombre de lignes 
120 nombre de lignes 
102 nombre de lignes 
102 nombre de lignes 
9 nombre de lignes 
104 nombre de lignes 
104 nombre de lignes 
105 nombre de lignes 
105 nombre de lignes 
102 nombre de lignes 
102 nombre de lignes 
102 nombre de lignes 
102 nombre de lignes 
109 nombre de lignes 
105 nombre de lignes 
105 nombre de lignes 

有人知道問題來自哪裏嗎? 感謝您的閱讀。

+0

提示:如果你想捕捉工具的輸出(例如,用於張貼在網絡上),設置'LC_ALL = en_EN'使輸出以英文語言環境顯示。 – DevSolar 2014-11-06 09:43:50

+0

一個好主意,如果你想檢查一個文件是否少於10行就是使用'head -n 10 file | wc -l而不是'cat file |如果可以確定該文件有10行或更多行,則wc -l(或'wc -l <​​file')提前結束'wc'。 – 2014-11-06 10:05:00

回答

4

<執行字符串比較。要執行數值比較,使用-lt

if [ "$nblines" -lt 10 ]; then 

你是否要使用[[[這裏(他們應該這樣做),但要注意[[不是POSIX指定讓你的腳本就這取決於你便攜性較差。在這種情況下,應該沒有必要引用你的變量,但無論如何這是一個好習慣。

在bash,你跟數字打交道時,可以使用(())一個更熟悉的語法:

if ((nblines < 10)); then 

你並不需要在變量名前使用$因爲在算術方面,任何字符將被假定爲指代一個變量。

順便說一句,你爲什麼用let?嘗試nblines=$(wc -l < file)(節省無用的cat)。

0

嘗試:

if [ $nblines -lt 10 ]; then 
1

使用-ltif

let nblines=$(cat file | wc -l) 

if [[ $nblines -lt 10 ]]; then 
    cat file >> A 
else 
    cat file >> B 
fi 
0

爲什麼不

[[ $(wc -l < file) -lt 10 ]] && cat file >> A || cat file >> B 

[[ $(wc -l < file) -lt 10 ]] && x=A || x=B 
cat file >> "$x"