Per un array con valori arbitrari, è piuttosto complicato bash
in quanto non ha un operatore incorporato per questo.
bash
tuttavia non supporta l'archiviazione di caratteri NUL nelle sue variabili, quindi è possibile utilizzarlo per passarlo ad altri comandi:
L'equivalente di zsh
's:
new_array=("${(@u}array}")
su un recente sistema GNU, potrebbe essere:
eval "new_array=($(
printf "%s\0" "${array[@]}" |
LC_ALL=C sort -zu |
xargs -r0 bash -c 'printf "%q\n" "$@"' sh
))"
In alternativa, con le versioni recenti di bash
e supponendo che nessuno degli elementi dell'array sia vuoto, è possibile utilizzare array associativi:
unset hash
typeset -A hash
for i in "${array[@]}"; do
hash[$i]=
done
new_array=("${!hash[@]}")
Con bash 4.4 e versioni successive e con GNU sort
:
readarray -td '' new_array < <(
printf '%s\0' "${array[@]}" | LC_ALL=C sort -zu)
L'ordine degli elementi non sarebbe lo stesso in quelle diverse soluzioni.
Con tcsh
:
set -f new_array = ($array:q)
Manterrebbe la f elemento irst ( a b a
=> a b
) come zsh
's (u)
bandiera espansione.
set -l new_array = ($array:q)
Manterrebbe l'ultimo ( a b a
=> b a
). Quelli tuttavia rimuovono gli elementi vuoti dall'array.