对列表进行排序并将排序值添加到bash中的新列表中

时间:2015-05-29 09:24:06

标签: string bash list sorting

我正在尝试对列表的所有值进行排序,并将它们排序到另一个列表中。 排序-nu工作正常,但他不想将$ i添加到新的SortedList。这可能是什么问题?

function Sort() {
   SortedList=""
   for i in $list;
   do
      echo $i
      $SortedList= "$SortedList $i"
   done | sort -nu
}
回声"这是排序列表:$ SortedList"

2 个答案:

答案 0 :(得分:0)

您的解决方案会尝试在排序本身之前将列表项存储到SortedListecho $i部分将列表发送到管道,然后sort -nu将其打印(已排序)到STDOUT。如果要将排序列表存储到变量中,请尝试以下操作:

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

如果您想知道函数调用后SortedList变量为什么为空,则问题是sort命令的管道。没有管道它工作正常。来自wiki:

  

在最常用的简单管道中,shell通过管道连接一系列子进程,并在每个子进程中执行外部命令。因此,shell本身不会直接处理流经管道的数据。

这意味着管道的for部分启动了一个新的子流程(初始化了已排序的var),它会按预期更改已排序的变量。但是,当流程结束时,您将返回环境中的变量的初始值。

另外,请参阅此帖子(Set a parent shell's variable from a subshell

答案 1 :(得分:0)

我认为您可以执行以下操作。

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

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

它可能会失败,因为我们仍然不知道你的list是怎样的。