Für ein Array mit beliebigen Werten ist es ziemlich schwierig, bash
da es keinen eingebauten Operator dafür hat.
bash
Das Speichern von NUL-Zeichen in seinen Variablen wird jedoch nicht unterstützt. Sie können dies also verwenden, um dies an andere Befehle zu übergeben:
Das Äquivalent von zsh
's:
new_array=("${(@u}array}")
auf einem neueren GNU-System könnte sein:
eval "new_array=($(
printf "%s\0" "${array[@]}" |
LC_ALL=C sort -zu |
xargs -r0 bash -c 'printf "%q\n" "$@"' sh
))"
Alternativ können Sie in neueren Versionen von bash
und unter der Annahme, dass keines der Array-Elemente leer ist, assoziative Arrays verwenden:
unset hash
typeset -A hash
for i in "${array[@]}"; do
hash[$i]=
done
new_array=("${!hash[@]}")
Mit Bash 4.4 und neuer und mit GNU sort
:
readarray -td '' new_array < <(
printf '%s\0' "${array[@]}" | LC_ALL=C sort -zu)
Die Reihenfolge der Elemente wäre in diesen verschiedenen Lösungen nicht gleich.
Mit tcsh
:
set -f new_array = ($array:q)
Würde behalten die f irst Element ( a b a
=> a b
) , wie zsh
‚s (u)
Expansion Flagge.
set -l new_array = ($array:q)
Würde das letzte ( a b a
=> b a
) behalten . Diese entfernen jedoch leere Elemente aus dem Array.