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