Para una matriz con valores arbitrarios, es bastante complicado bash
ya que no tiene un operador incorporado para eso.
bash
sin embargo, no admite el almacenamiento de caracteres NUL en sus variables, por lo que puede hacer uso de eso para pasar eso a otros comandos:
El equivalente de zsh
's:
new_array=("${(@u}array}")
en un sistema GNU reciente, podría ser:
eval "new_array=($(
printf "%s\0" "${array[@]}" |
LC_ALL=C sort -zu |
xargs -r0 bash -c 'printf "%q\n" "$@"' sh
))"
Alternativamente, con versiones recientes de bash
, y suponiendo que ninguno de los elementos de la matriz esté vacío, podría usar matrices asociativas:
unset hash
typeset -A hash
for i in "${array[@]}"; do
hash[$i]=
done
new_array=("${!hash[@]}")
Con bash 4.4 y más reciente y con GNU sort
:
readarray -td '' new_array < <(
printf '%s\0' "${array[@]}" | LC_ALL=C sort -zu)
El orden de los elementos no sería el mismo en esas diferentes soluciones.
Con tcsh
:
set -f new_array = ($array:q)
Conservaría la f elemento rimero ( a b a
=> a b
) como zsh
's (u)
bandera de expansión.
set -l new_array = ($array:q)
Retendría el último ( a b a
=> b a
). Sin embargo, esos eliminan elementos vacíos de la matriz.