Для массива с произвольными значениями это довольно сложно, так bash
как для этого нет встроенного оператора.
bash
однако случается, что он не поддерживает сохранение символов NUL в своих переменных, поэтому вы можете использовать это для передачи этого другим командам:
Эквивалент zsh
's:
new_array=("${(@u}array}")
на недавней системе GNU, может быть:
eval "new_array=($(
printf "%s\0" "${array[@]}" |
LC_ALL=C sort -zu |
xargs -r0 bash -c 'printf "%q\n" "$@"' sh
))"
В качестве альтернативы, в последних версиях bash
и при условии, что ни один из элементов массива не пуст, вы можете использовать ассоциативные массивы:
unset hash
typeset -A hash
for i in "${array[@]}"; do
hash[$i]=
done
new_array=("${!hash[@]}")
С bash 4.4 и новее и с GNU sort
:
readarray -td '' new_array < <(
printf '%s\0' "${array[@]}" | LC_ALL=C sort -zu)
Порядок элементов не будет одинаковым в этих разных решениях.
С tcsh
:
set -f new_array = ($array:q)
Сохранить Будет ли е IRST элемент ( a b a
=> a b
) , как zsh
«S (u)
флага расширения.
set -l new_array = ($array:q)
Сохранит последний ( a b a
=> b a
). Однако те удаляют пустые элементы из массива.