Untuk array dengan nilai arbitrer, cukup rumit bash
karena tidak memiliki operator bawaan untuk itu.
bash
namun terjadi tidak mendukung penyimpanan karakter NUL dalam variabelnya, sehingga Anda dapat menggunakannya untuk meneruskannya ke perintah lain:
Setara zsh
dengan:
new_array=("${(@u}array}")
pada sistem GNU baru-baru ini, dapat:
eval "new_array=($(
printf "%s\0" "${array[@]}" |
LC_ALL=C sort -zu |
xargs -r0 bash -c 'printf "%q\n" "$@"' sh
))"
Atau, dengan versi terbaru dari bash
, dan dengan asumsi tidak ada elemen array yang kosong, Anda bisa menggunakan array asosiatif:
unset hash
typeset -A hash
for i in "${array[@]}"; do
hash[$i]=
done
new_array=("${!hash[@]}")
Dengan bash 4.4 dan yang lebih baru dan dengan GNU sort
:
readarray -td '' new_array < <(
printf '%s\0' "${array[@]}" | LC_ALL=C sort -zu)
Urutan elemen tidak akan sama dalam solusi yang berbeda tersebut.
Dengan tcsh
:
set -f new_array = ($array:q)
Akan mempertahankan f elemen irst ( a b a
=> a b
) seperti zsh
's (u)
bendera ekspansi.
set -l new_array = ($array:q)
Akan mempertahankan yang terakhir ( a b a
=> b a
). Namun itu menghapus elemen kosong dari array.