Как отсортировать массив с комбинацией букв и цифр в bash? [дубликат]

Проблема в строке:

if [ $#=3 ]

Поскольку у вас нет пробелов вокруг = , он обязательно выполняет:

if [ -n $#=3 ]

test, который всегда будет верным как = 3 всегда там, поэтому else никогда не сработает.

Вам необходимо использовать пробелы вокруг = :

if [ $# = 3 ]

Также используйте двойные кавычки при раскрытии переменных, чтобы избежать разделения слов и расширения имени пути, хотя это не обязательно в случае $ # , хотя .

2
27.12.2018, 15:20
3 ответа

Возьмем массив Aкак

A=(h4 h5 h1 h2 h3)

Теперь проблема с командой sortзаключается в том, что она сортирует элементы в разных строках и не может сортировать элементы в одной строке. Таким образом, обходной путь состоит в том, чтобы преобразовать массив в элемент на строку и отсортировать с помощью sortи поместить их в массив, который фактически отсортирован, то есть

B=(`echo ${A[@]} | tr " " "\n" | sort`)

Теперь B — отсортированный массив. Здесь trпреобразует пробел в новую строку

1
27.01.2020, 21:55

Попробуйте это,

Просто распечатайте, отсортируйте и сохраните значения в одном имени массива.

ary=(h4 h5 h1 h2 h3)
ary=(`printf '%s\n' "${ary[@]}"|sort`)

echo ${ary[@]}
h1 h2 h3 h4 h5
2
27.01.2020, 21:55

Нет необходимости использовать tr; «Расширение параметров» оболочки с адекватнымIFS(в подоболочке )должно быть достаточно. Попробуйте

$ ARR=(h4 h5 h1 h2 h3)
$ SA=( $(IFS=$'\n'; echo "${ARR[*]}" | sort) )
$ BRR=(s4 h5 q1 h2 g3)
$ SB=( $(IFS=$'\n'; echo "${BRR[*]}" | sort -k1.2) )
$ echo "${SB[*]}" 
q1 h2 g3 s4 h5
3
27.01.2020, 21:55

Теги

Похожие вопросы