2012-05-19 35 views
3

我想將排序方法的結果放入數組,其中每個單元格包含一個單詞。我想這個代碼,但只有$文件的一部分被打印並且其不排序:從字符串更改爲陣列不能按預期在Bash中工作

#!/bin/bash 
for file in `ls ${1}` ; do 
    if [[ ! ($file = *.user) ]] ; then 
     continue 
    fi 

    arr=(`sort -nrk4 $file`) 
    echo ${arr[*]} 

done 

爲什麼心不是這方面的工作?我怎樣才能做到這一點?

數據文件:

name1 01/01/1994 a 0 
name2 01/01/1994 b 5 
name3 01/01/1994 c 2 

如果我運行排序行只(排序-nrk4 $文件),這是什麼印刷:

name2 01/01/1994 b 5 
name3 01/01/1994 c 2 
name1 01/01/1994 a 0 

當運行如上所述,該2條線它是打印的內容:

name1 01/01/1994 a 0 
+0

@Mat更新了樣品 – Omar

+0

這工作正常。你有什麼版本的Bash? – Mat

+0

@Mat version 3.00.15(1)-release ..我用所有腳本更新了這個問題,你看到任何可能的原因嗎? – Omar

回答

1

爲了使sort輸出的每一行被投入到自己的ARRA y元素,IFS需要設置爲換行符。要輸出數組,您需要遍歷它。

#!/bin/bash 
for file in $1; do 
    if [[ ! $file = *.user ]]; then 
     continue 
    fi 

    saveIFS=$IFS 
    IFS=$'\n' 
    arr=($(sort -nrk4 "$file")) 
    IFS=$saveIFS 
    for i in "${arr[@]}" 
    do 
     echo "$i" 
    done 

done 

可替換地,不重置IFS,不使用用於輸出的循環和下面的命令將輸出自的IFS的第一個字符由換行分隔元件用於輸出分離器當使用*在一個帶引號的背景下標:

echo "${arr[*]}" 

記住,引用修復一切。

請勿在for循環中使用ls。如果$1可能包含globbing,則應該不加引號。它不是,那麼它應該被引用以防目錄或文件名可能包含空格字符。理想情況下,$1的內容在使用之前應進行驗證。

比較運算符的優先級高於否定運算符,所以括號是不必要的。

對於命令替換,$()優於反引號。它們更具可讀性並且更易於嵌套使用。

最後,當變量被展開時,應該被引用。另外,@應該幾乎總是用於下標數組。

+0

這仍然不起作用,它仍然不打印所有行.. – Omar

+0

@Omar:哦,*現在*我看到發生了什麼。請看我編輯的答案。 –

相關問題