Para uma matriz com valores arbitrários, é bastante complicado bash
, pois não possui um operador interno para isso.
bash
no entanto, não suporta o armazenamento de caracteres NUL em suas variáveis; portanto, você pode usá-lo para passar isso para outros comandos:
O equivalente a zsh
's:
new_array=("${(@u}array}")
em um sistema GNU recente, pode ser:
eval "new_array=($(
printf "%s\0" "${array[@]}" |
LC_ALL=C sort -zu |
xargs -r0 bash -c 'printf "%q\n" "$@"' sh
))"
Como alternativa, com versões recentes de bash
, e assumindo que nenhum dos elementos da matriz está vazio, você pode usar matrizes associativas:
unset hash
typeset -A hash
for i in "${array[@]}"; do
hash[$i]=
done
new_array=("${!hash[@]}")
Com o bash 4.4 e mais recente e com o GNU sort
:
readarray -td '' new_array < <(
printf '%s\0' "${array[@]}" | LC_ALL=C sort -zu)
A ordem dos elementos não seria a mesma nessas soluções diferentes.
Com tcsh
:
set -f new_array = ($array:q)
Reteria o f elemento irst ( a b a
=> a b
) como zsh
's (u)
flag expansão.
set -l new_array = ($array:q)
Reteria o último ( a b a
=> b a
). Esses, no entanto, removem elementos vazios da matriz.