如何在Bash中按降序对字符串数组进行排序?

时间:2016-10-22 14:11:00

标签: arrays bash shell sorting scripting

假设我有一个数组:

nameArr=("Leia", "Darth Vader", "Anakin", "Han Solo", "Yoda")

我想按降序排序。我怎么能在Bash shell脚本中做到这一点?按升序我使用命令:

arrAsc=($(for l in ${nameArr[@]}; do echo $l; done | sort))

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

你的问题激励我制作一个我相信将来会派上用场的功能:

sort_array () { local v="$1[*]" IFS=$'\n'; read -d $'\0' -a "$1" < <(sort "${@:2}" <<< "${!v}"); }

用法:sort_array NameOfArrayVariable [传递给排序命令的标志]

nameArr=("Leia", "Darth Vader", "Anakin", "Han Solo", "Yoda")
调用sort_array nameArr将导致nameArr包含(“Anakin”,“Darth Vader”,“Han Solo”,“Leia”,“Yoda”);调用sort_array nameArr -r将导致nameArr包含(“Yoda”“Leia”,“Han Solo”,“Darth Vader”,“Anakin”)

另外,只是抬头,当您在bash中声明或设置数组时,不要使用逗号分隔元素,因为"Leia","Leia,"相同,除非您将IFS设置为包含逗号

此函数也适用于整数数组:

$ nums=()
$ for ((i=0; i<10; ++i)); do nums+=($RANDOM); done
$ echo "${nums[@]}";
22928 7011 18865 24027 18559 9037 3885 10873 32369 21932
$ sort_array nums -n
$ echo "${nums[@]}"
3885 7011 9037 10873 18559 18865 21932 22928 24027 32369
$ sort_array nums -nr 
$ echo "${nums[@]}"
32369 24027 22928 21932 18865 18559 10873 9037 7011 3885

答案 1 :(得分:1)

您可以相当轻松地使用IFS内部字段分隔符),sort -r以及printf的一些帮助。使用命令替换,您可以输出和排序数组,然后只需将排序后的结果读回nameArr。例如:

#!/bin/bash

nameArr=("Leia", "Darth Vader", "Anakin", "Han Solo", "Yoda")

IFS=$'\n'           ## only word-split on '\n'
nameArr=( $(printf "%s\n" ${nameArr[@]} | sort -r ) )  ## reverse sort

declare -p nameArr  ## simply output the array

示例使用/输出

调用脚本会产生以下结果:

$ bash revarr.sh
declare -a nameArr='([0]="Yoda" [1]="Leia," [2]="Han Solo," [3]="Darth Vader," [4]="Anakin,")'

注意: 不要忘记恢复默认IFS=$' \t\n'spacetabnewline如果你的脚本继续,那么在完成排序的时候。