2015-05-29 60 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” –