📜  如何在 shell 脚本中对数组进行排序 - Shell-Bash (1)

📅  最后修改于: 2023-12-03 14:52:34.466000             🧑  作者: Mango

如何在 Shell 脚本中对数组进行排序

在 Shell 编程中,对于常规操作,会经常需要对数组进行操作。其中一个常见需求是对数组进行排序。本文将介绍在 Shell 脚本中如何对数组进行排序的方法。

1. 数组元素排序
1.1 数字数组元素排序

对于一个数字数组,可以使用内置命令 sort 来排序:

#!/bin/bash

numbers=(8 3 1 6 4 7 5 2)

sorted_numbers=($(echo "${numbers[@]}" | tr ' ' '\n' | sort -n))

echo "原数组:${numbers[@]}"
echo "排序后的数组:${sorted_numbers[@]}"

上述代码定义了一个数字数组 numbers,然后通过 $() 命令替换将数组元素转成单独的行,通过 tr 命令将空格替换成换行符后,传递给 sort 命令进行排序。最后再通过 $() 命令替换将已排序的行转成数组元素,保存到 sorted_numbers 数组中。

输出结果为:

原数组:8 3 1 6 4 7 5 2
排序后的数组:1 2 3 4 5 6 7 8
1.2 字符串数组元素排序

对于一个字符串数组,可以使用 sort 命令的默认排序方式进行排序,即按照字典序进行排序:

#!/bin/bash

fruits=("apple" "orange" "banana" "grape" "watermelon")

sorted_fruits=($(echo "${fruits[@]}" | tr ' ' '\n' | sort))

echo "原数组:${fruits[@]}"
echo "排序后的数组:${sorted_fruits[@]}"

上述代码定义了一个字符串数组 fruits,同样是通过 $() 命令替换将数组元素转成单独的行,然后通过 sort 命令对其进行排序。最后同样是通过 $() 命令替换将已排序的行转成数组元素,保存到 sorted_fruits 数组中。

输出结果为:

原数组:apple orange banana grape watermelon
排序后的数组:apple banana grape orange watermelon
2. 数组下标排序

有时候需要按照数组下标的大小来排序,可以通过 sort 命令实现:

#!/bin/bash

numbers=(8 3 1 6 4 7 5 2)

sorted_indexes=($(echo "${!numbers[@]}" | tr ' ' '\n' | sort -n))

echo "原数组:${numbers[@]}"
echo "排序后的数组下标:${sorted_indexes[@]}"
echo "排序后的数组:${numbers[${sorted_indexes[0]}]} ${numbers[${sorted_indexes[1]}]} ${numbers[${sorted_indexes[2]}]} ${numbers[${sorted_indexes[3]}]} ${numbers[${sorted_indexes[4]}]} ${numbers[${sorted_indexes[5]}]} ${numbers[${sorted_indexes[6]}]} ${numbers[${sorted_indexes[7]}]}"

上述代码首先通过 ${!numbers[@]} 获取数组下标,同样通过 $() 命令替换将下标转成单独的行,然后通过 sort 命令对其进行排序。最后通过 ${sorted_indexes[index]} 取出排序后的下标去访问原始数组,从而获取排序后的值。

输出结果为:

原数组:8 3 1 6 4 7 5 2
排序后的数组下标:0 1 2 3 4 5 6 7
排序后的数组:1 2 3 4 5 6 7 8

以上是在 Shell 脚本中对数组进行排序的几种方法,可以根据具体数组类型和排序需求进行选择。