Per un array con valori arbitrari, è piuttosto complicato bashin 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 bashe 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.