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.