使用tr命令和sort命令对数组重新排序

311 阅读1分钟

方法一:

步骤:

  1. 使用tr命令将数组内每个元素之间的空格替换为换行符;
  2. 之后使用sort命令按从小到大重新排序;
  3. 最后使用for循环遍历排序后的元素值。通过下标值重新定义数组中的每个元素。
 [root@yuji sh]# vim paixu1.sh
 #!/bin/bash
 ​
 arr=(63 4 24 1 3 15)
 echo "原数组的顺序为:${arr[@]}"
 #将每个元素之间的空格替换为换行符,然后重新排序
 list=$(echo ${arr[@]} | tr ' ' '\n' | sort -n)
 ​
 a=0
 for i in $list
 do
    #通过下标值定义数组中的每个元素
    newarr[$a]=$i
    let a++
 done
 echo "排序后的数组顺序为:${newarr[@]}"
 ​
 [root@yuji sh]# bash p1.sh
 原数组的顺序为:63 4 24 1 3 15
 排序后的数组顺序为:1 3 4 15 24 63

1.png

方法二:

for循环遍历排序后的元素值,直接定义数组中的每个元素。

 [root@yuji sh]# vim p2.sh
 #!/bin/bash
 ​
 arr=(63 4 24 1 3 15)
 echo "原数组的顺序为:${arr[@]}"
 #将每个元素之间的空格替换为换行符,然后重新排序
 list=$(echo ${arr[@]} | tr ' ' '\n' | sort -n)
 ​
 for i in $list
 do
    newarr+=($i)
 done
 echo "排序后的数组顺序为:${newarr[@]}"
 ​
 [root@yuji sh]# bash p2.sh
 原数组的顺序为:63 4 24 1 3 15
 排序后的数组顺序为:1 3 4 15 24 63

2.png

方法三:

先定义列表,再引用列表的值定义数组。

 [root@yuji sh]# arr=(63 4 24 1 3 15)
 [root@yuji sh]# echo ${arr[@]} |tr ' ' '\n' |sort -n
 1
 3
 4
 15
 24
 63
 [root@yuji sh]# list=$(echo ${arr[@]} |tr ' ' '\n' |sort -n)
 [root@yuji sh]# echo $list
 1 3 4 15 24 63
 [root@yuji sh]# newarr=($list)
 [root@yuji sh]# echo ${newarr[@]}
 1 3 4 15 24 63

3.png

方法四:

 [root@yuji sh]# arr=(63 4 24 1 3 15)                           
 [root@yuji sh]# echo ${arr[@]} |tr ' ' '\n' |sort -n           1
 3
 4
 15
 24
 63
 [root@yuji sh]# new=(`echo ${arr[@]} |tr ' ' '\n' |sort -n`)
 [root@yuji sh]# echo ${new[@]}
 1 3 4 15 24 63

4.png

注意事项:

使用echo输出变量值时,变量是否加双引号会影响输出的结果:

  1. 使用 echo $list 输出变量值时,会将变量值中的换行符都替换成空格。
  2. 使用 echo "$list" 输出变量值时,可正常输出变量值中的换行符。
  3. echo '$list' 只会把 $list 当成普通的字符串,因为单引号无法引用变量值。
 [root@yuji sh]# echo $list
 1 3 4 15 24 63
 [root@yuji sh]# echo "$list"
 1
 3
 4
 15
 24
 63
 [root@yuji sh]# echo '$list'
 $list

5.png