zsh
:
print -r -- ${(Oa)=VAR}
$=VAR
розпадається $VAR
на $IFS
. (Oa)
упорядковує отриманий список у порядку зворотного масиву. print -r --
(як в ksh
), те саме, що echo -E -
( zsh
конкретно) є надійною версієюecho
: друкує свої аргументи як-розділяється пробілом, закінчується новим рядком.
Якщо ви хочете розділити лише пробіл, а не на те, що $IFS
міститься (пробіл, вкладка, нова лінія, нуль за замовчуванням), або призначте простір $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"