zsh
:
print -r -- ${(Oa)=VAR}
$=VAR
расщепляется $VAR
на $IFS
. (Oa)
упорядочивает результирующий список в обратном порядке массива. print -r --
(как в ksh
), так же, как echo -E -
( zsh
конкретные) это надежные версииecho
: печатает свои аргументы как-разделенные пробелом, завершается символом новой строки.
Если вы хотите разделить только на пробел, а не на то, что $IFS
содержится (пробел, табуляция, новая строка, nul по умолчанию), либо назначьте пробел $IFS
, либо используйте явное разбиение, например:
print -r -- ${(Oas: :)VAR}
Для сортировки в обратном порядке:
$ VAR='50 10 20 90 100 30 60 40 70 80'
$ print -r -- ${(nOn)=VAR}
100 90 80 70 60 50 40 30 20 10
POSIXly (так будет работать и с bash
):
printf
Только со встроенными в оболочку (за исключением некоторых оболочек) механизмами (лучше для переменных с коротким значением):
unset -v IFS # restore IFS to its default value of spc, tab, nl
set -o noglob # disable glob
set -- $VAR # use the split+glob operator to assign the words to $1, $2...
reversed_VAR= sep=
for i do
reversed_VAR=$i$sep$reversed_VAR
sep=' '
done
printf '%s\n' "$reversed_VAR"
С awk
(лучше для больших переменных, особенно с bash
, но с ограничением размера аргументов (или одного аргумента)):
awk '
BEGIN {
n = split(ARGV[1], a);
while (n) {printf "%s", sep a[n--]; sep = " "}
print ""
}' "$VAR"