2014-03-06 117 views
0

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

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

回答

0

你需要使用命令替换$(...)捕捉到这样的一个命令的输出。

#!/bin/bash 
if [ $# -lt 1 ] || [ $# -gt 5 ]; then 
    echo "Incorrect number of arguments!" 
else 
    sorted=$(for var in "[email protected]"; 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 
2

您可以从标准输入中给出sort命令值。该公司预计在自己的行每一个值,你可以通过组合echotr实现:

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

如果你想要得到的结果是空间分隔的一次不换行分隔的tr最后调用只需要。

4

尝试:

sorted=$(printf '%s\n' "[email protected]" | sort -rn) 
printf '%s\n' "${sorted//$'\n'/ }" 
+1

+1。像这样使用printf是最安全,最简洁的方式来输出每行一行的列表。为了将它们作为单行输出,我会试图忽略我自己的赞美,并且只是'echo $ sorted'(不带任何引号) - 或'sorted =($(print ... | sort)); printf“%s”“$ {sorted [@]}”' –

+1

谢谢!或者:'sorted =($(printf'%s \ n'“$ @”| sort -nr)); printf'%s \ n'“$ {sorted [*]}”'。 –

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' ' '