Pour un tableau avec des valeurs arbitraires, c'est assez délicat bash
car il n'a pas d'opérateur intégré pour cela.
bash
Cependant, il ne prend pas en charge le stockage de caractères NUL dans ses variables, vous pouvez donc vous en servir pour passer cela à d'autres commandes:
L'équivalent de zsh
's:
new_array=("${(@u}array}")
sur un système GNU récent, pourrait être:
eval "new_array=($(
printf "%s\0" "${array[@]}" |
LC_ALL=C sort -zu |
xargs -r0 bash -c 'printf "%q\n" "$@"' sh
))"
Alternativement, avec des versions récentes de bash
, et en supposant qu'aucun des éléments du tableau n'est vide, vous pouvez utiliser des tableaux associatifs:
unset hash
typeset -A hash
for i in "${array[@]}"; do
hash[$i]=
done
new_array=("${!hash[@]}")
Avec bash 4.4 et plus récent et avec GNU sort
:
readarray -td '' new_array < <(
printf '%s\0' "${array[@]}" | LC_ALL=C sort -zu)
L'ordre des éléments ne serait pas le même dans ces différentes solutions.
Avec tcsh
:
set -f new_array = ($array:q)
Conserverait le f élément irst ( a b a
=> a b
) comme zsh
des » (u)
drapeau d'extension.
set -l new_array = ($array:q)
Conserverait le dernier ( a b a
=> b a
). Cependant, ceux-ci suppriment les éléments vides du tableau.