是否有一个适用于命令行参数的命令,例如sort命令对文件的作用?

时间:2014-03-06 09:49:55

标签: bash unix scripting

我正在尝试在BASH中编写一个脚本,该脚本将从用户获取1到5个命令行参数,并以反向数字顺序将它们报告回标准输出。我知道唯一与此类似的命令是sort命令,但这仅适用于文件。是否有类似的命令来排序命令行参数?这是我到目前为止所拥有的。

#!/bin/bash
if [ $# -lt 1 ] || [ $# -gt 5 ];
then echo "Incorrect number of arguments!"
else
     sorted=sort -rn $*
     echo "SORTED: $sorted"
fi

4 个答案:

答案 0 :(得分:4)

尝试:

sorted=$( printf '%s\n' "$@" | sort -rn )
printf '%s\n' "${sorted//$'\n'/ }"

答案 1 :(得分:2)

您可以从标准输入中提供sort命令值。它期望每个值都在自己的行上,您可以通过组合echotr来实现:

sorted=$(echo $* | tr ' ' '\n' | sort -rn - | tr '\n' ' ')

仅当您希望结果再次以空格分隔而不是换行符分隔时,才需要最后一次调用tr

答案 2 :(得分:1)

#!/bin/bash
if [ $# -lt 1 ] || [ $# -gt 5 ];
then echo "Incorrect number of arguments!"
else
     sorted=$(echo $* | tr ' ' '\n' | sort -rn | tr '\n' ' ')
     echo "SORTED: $sorted"
fi
echo $* | tr ' ' '\n' | sort -rn | tr '\n' ' '

答案 3 :(得分:0)

您需要使用命令替换$(...)来捕获类似命令的输出。

#!/bin/bash
if [ $# -lt 1 ] || [ $# -gt 5 ]; then
    echo "Incorrect number of arguments!"
else
    sorted=$(for var in "$@"; do echo "$var"; done | sort -rn | tr -d '\n')
    echo "SORTED: $sorted"
fi

$ ./test 1 2 3 4 5
SORTED: 5 4 3 2 1
$ ./test 5 4 3 2 1
SORTED: 5 4 3 2 1