2015-05-29 101 views
1

我想排序列表中的所有值,並將它們排序到另一個列表中。 sort -nu工作正常,但他不想將$ i添加到新的SortedList中。這裏可能是什麼問題?排序列表並將排序後的值添加到bash中的新列表

function Sort() { 
    SortedList="" 
    for i in $list; 
    do 
     echo $i 
     $SortedList= "$SortedList $i" 
    done | sort -nu 
} 

回聲「這是排序列表:$排序列表」

+0

'$ SortedList =「$ SortedList $ i」'行應該是'SortedList =「$ SortedList $ i」'。 A $和更少的空間。但我想這還不夠。 –

+0

即使修正了這個問題,我也不明白'SortedList'如何在最後被排序......管道不會改變迭代順序。 –

+0

是的,這就是爲什麼我編輯我的評論。您只需將我附加到排序列表中,因此它將成爲列表的副本。 –

回答

0

我認爲你可以這樣做以下。

#!/bin/bash 
list="7 4 2 5 3" 

function Sort() { 
    SortedList=$(echo $list | tr " " "\n" | sort -nu) 
} 
Sort 
echo $SortedList 

它可能會失敗,因爲我們仍然不知道你怎麼list樣子。

+0

感謝它的工作。 –

0

您的解決方案試圖將列表項的SortedList存儲排序本身之前。 echo $i部件將該列表發送到管道,然後sort -nu將其打印(排序)到STDOUT。如果你想存儲排序列表中的變量,只是試試這個:

function Sort() { 
    SortedList=`for i in $list; do echo $i; done | sort -nu` 
} 

如果你想知道爲什麼SortedList變量函數調用後空的,問題是管到sort命令。沒有管道,它工作正常。來自wiki:

在最常用的簡單管道中,shell通過管道連接一系列子進程,並在每個子進程內執行外部命令。因此,外殼本身並不直接處理流經管道的數據。

這意味着管道的for部分啓動一個新的子流程(對已排序的var進行初始化),該流程會根據需要更改已排序的變量。但是,當過程結束時,您將以變量的初始值回到環境中。

此外,諮詢這個帖子(Set a parent shell's variable from a subshell

+0

好的,謝謝。我理解這個問題。你知道在整個腳本中使用變量的方法嗎? –

+0

根據SO的帖子,沒有辦法改變子shell內的變量,所以你可以嘗試通過文件做到這一點,或者你可以做兩次for-loop,第一次只設置變量,第二次將輸出放到管道中。 –

+0

謝謝,他仍然給我錯誤「= 5:命令未找到」在這一行:$ SortedList =「$ SortedList $ i」 –