Linux bash 脚本:对要使用的列表进行排序

Linux bash scripting: sorting a list to use

我正在我的脚本中实现一个排序函数,但我在这样做时遇到了问题:

我想要实现的是:

bash script --sort 44 55 1 23 44

输出:

Pinging to 192.168.1.1 succes
Pinging to 192.168.1.23 failed
Pinging to 192.168.1.44 failed
Pinging to 192.168.1.55 failed

ping 和其他东西已经工作了,我只是不知道如何用参数制作一个列表,对它们进行排序并(保存列表)然后 在ping 命令(通过使用 for var in $SORTEDLIST do <ping-command> done.

我已经有了这个:

    SORTEDLIST="$SORTEDLISTS $@"
    for var in $SORTEDLISTS
    do
            echo "$var"
    done | sort -n -u

回声只是一个测试,但我必须以某种方式保存列表。 有什么想法吗?

此脚本接受命令行参数,每行将它们分开 tr ' ' '\n',按数字排序 tr ' ' '\n' 并打印它们:

#!/bin/bash
LIST="$@"

for I in $(echo "$LIST" | tr ' ' '\n' | sort -g)
do
    echo $I
    echo "192.168.0.1.$I"
done

$@ 是一个数组(包含所有脚本参数),因此您可以使用

进行排序
OIFS="$IFS" # save IFS
IFS=$'\n' sorted=($(sort -n <<<"$*"))
IFS="$OIFS" # restore IFS

然后像这样使用结果:

for I in "${sorted[@]}"; do
    ...
done

解释:

  • IFS 是一个内部 shell 变量 (internal field separator),它告诉 shell 哪个字符分隔单词(默认为 space、制表符和换行符).
  • $'\n' 扩展为单个换行符。当 shell 展开 $* 时,它现在会在每个元素之间换行。
  • sort -n <<< 通过管道将 "one argument per line" 传递给 sort,后者按数字排序 (-n)
  • sorted=($(...)) 使用命令 ...
  • 的结果创建一个新数组

另请参阅:

  • How to sort an array in BASH