Есть ли команда, которая работает для аргументов командной строки, как команда сортировки для файлов?
Я пытаюсь написать скрипт на 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