Так что, если у меня есть переменная
VAR='10 20 30 40 50 60 70 80 90 100'
и повторить это
echo "$VAR"
10 20 30 40 50 60 70 80 90 100
Однако далее по сценарию мне нужно изменить порядок этой переменной, чтобы она выглядела как
echo "$VAR" | <code to reverse it>
100 90 80 70 60 50 40 30 20 10
Я попытался использовать Rev, и он буквально перевернул все, так что получилось
echo "$VAR" | rev
001 09 08 07 06 05 04 03 02 01
Ответы:
В системах GNU обратная сторона каталогов:
источник
echo $'100 \n90 80 70 60 50 40 30 20 10'
tac -s" " <<< "$VAR "
версии он по-прежнему вставляет начальную пустую строку, добавляет завершающий пробел и пропускает завершающий символ новой строки (как будтоprintf '\n%s ' "$reversed_VAR"
вместо ожидаемогоprintf '%s\n' "$reversed_VAR"
)echo $(tac -s" " <<< $VAR)
не имеет завершающего пробела, потому что$(…)
удаляет завершающие символы новой строки и пробелы, если IFS их имеет. Мое решение будет исправлено в ближайшее время, спасибо.Для краткого списка и для переменной самой оболочкой является самое быстрое решение:
Выход:
Примечание: операция разбиения в
set -- $var
безопасна для точной строки, используемой здесь, но не будет таковой, если строка содержит символы подстановки (*
,?
или[]
). Этого можно избежатьset -f
до раскола, если это необходимо. То же самое примечание также действительно для следующих решений (кроме случаев, где указано).Или, если вы хотите установить другую переменную с обратным списком:
Или используя только позиционные параметры.
Или используя только одну переменную (которая может быть самой переменной var):
Примечание. Это решение не зависит ни от глобализации, ни от IFS.
источник
awk
для спасенияс
perl
, любезно Как прочитать IP-адрес в обратном направлении? опубликовано @steeldriverИли с
bash
самим собой, преобразовав строку в массивисточник
Вы можете использовать функции bash, такие как массивы, чтобы сделать это полностью в процессе:
Это должен быть самый быстрый способ сделать это при условии, что $ VAR не очень большой.
источник
VAR='+ * ?'
). Используйтеset -o noglob
или,set -f
чтобы исправить это. В целом,$IFS
при использовании оператора split + glob рекомендуется учитывать значение и состояние глобирования. Нет, в этом нет смысла использовать этот операторrev_a+=( ${a[$i]} )
,rev_a+=( "${a[$i]}" )
будет гораздо больше смысла.источник
Используйте немного магии Python здесь:
Как это работает, довольно просто:
"$VAR"
второй параметр командной строкиsys.argv[1]
(первый параметр с-c
параметром всегда просто-c
самим собой. Обратите внимание на"$VAR"
кавычки, чтобы не разбить саму переменную на отдельные слова (что было сделано с помощью shell, а не python).split()
метод, чтобы разбить его на список строк[::-1]
часть просто расширенный синтаксис среза, чтобы получить обратный список" ".join()
и распечатываемНо те, кто не являются большими поклонниками Python, мы могли
AWK
бы сделать по существу одно и то же: разделить и напечатать массив в обратном порядке:источник
python3 -c 'import sys;print(*reversed(sys.argv[1:]))' $VAR
$IFS
содержит правильные символы, и не отключая часть glob."$VAR"
урожайностиpython3 -c 'import sys;print(*reversed(sys.argv[1].split()))' "$VAR"
zsh
:$=VAR
расщепляется$VAR
на$IFS
.(Oa)
упорядочивает результирующий список в обратном порядке массива.print -r --
(как вksh
), так же, какecho -E -
(zsh
конкретные) это надежные версииecho
: печатает свои аргументы как-разделенные пробелом, завершается символом новой строки.Если вы хотите разделить только на пробел, а не на то, что
$IFS
содержится (пробел, табуляция, новая строка, nul по умолчанию), либо назначьте пробел$IFS
, либо используйте явное разбиение, например:Для сортировки в обратном порядке:
POSIXly (так будет работать и с
bash
):printf
Только со встроенными в оболочку (за исключением некоторых оболочек) механизмами (лучше для переменных с коротким значением):С
awk
(лучше для больших переменных, особенно сbash
, но с ограничением размера аргументов (или одного аргумента)):источник
Inelegant POSIX программные средства однострочные:
источник