Есть ли команда, которая работает для аргументов командной строки, как команда сортировки для файлов?

Я пытаюсь написать скрипт на 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 ответа

Пытаться:

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

Вы можете дать sort значения команды из стандартного ввода. Он ожидает каждого значения в своей строке, чего вы можете достичь, комбинируя echo а также tr:

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

Последний вызов tr необходимо, только если вы хотите, чтобы результат снова был разделен пробелом, а не символом новой строки.

#!/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' ' '

Вам нужно использовать подстановку команд $(...) чтобы захватить вывод такой команды.

#!/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
Другие вопросы по тегам