2014-03-06 39 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' ' '