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

String 在bash中对列表进行排序并将排序后的值添加到新列表中,string,bash,list,sorting,String,Bash,List,Sorting,我试图对列表中的所有值进行排序,并将它们添加到另一个列表中。 sort-nu工作正常,但他不想在新的SortedList中添加$i。这里有什么问题 function Sort() { SortedList="" for i in $list; do echo $i $SortedList= "$SortedList $i" done | sort -nu } echo“这是排序列表:$SortedList”您的解决方案尝试在排序之前将列表项存储到

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

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

echo“这是排序列表:$SortedList”

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

function Sort() {
    SortedList=`for i in $list; do echo $i; done | sort -nu`
}
如果您想知道为什么函数调用后
SortedList
变量为空,那么问题在于
sort
命令的管道。没有管道,它可以正常工作。从维基:

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

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


另外,请参考这篇文章()

我想你可以做如下的事情

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

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

它可能会失败,因为我们仍然不知道您的
列表的样子。

$SortedList=“$SortedList$i”
应该是
SortedList=“$SortedList$i”
。一美元和一个空间更少。但我想这还不够。即使修复了这个问题,我也不明白最后如何对
SortedList
进行排序。。。管道不会改变迭代顺序。是的,这就是我编辑评论的原因。您只需将i附加到已排序的列表中,因此它将成为列表的副本。您能否显示示例输入和预期输出?问题在于
排序
命令的管道。没有管道,它可以正常工作。我怀疑for命令是由于管道在不同的shell中执行。好的,谢谢。我理解这个问题。你知道在整个脚本中使用变量的方法吗?根据SO帖子,没有办法在子shell中更改变量,所以你可以尝试通过文件来更改,或者你可以执行两次for循环,第一次它只设置变量,第二次将输出放入管道。谢谢,他仍然告诉我错误“=5:未找到命令”在此行:$SortedList=“$SortedList$i”您必须删除第一个美元(SortedList=“$SortedList$i”),否则它第一次将$SortedList解释为空字符串,后跟“=5”字符串,然后将其解释为(不存在)对不起,我在代码中也有输入错误。已编辑并修复。为避免错误,您可以这样编写:
SortedList=$(tr“”)\n