配列をパラメータとして受け取り、ソートできる関数を作成する方法を見つけようとしています。位置変数で行われているようですが、わかりません。
ベストアンサー1
強く打つ
bash
まだ組み込みのサポートがないようです。オプションは、ソートアルゴリズムを手動で実装するか、sort
ソートアルゴリズムを呼び出すことです。
配列要素にゼロ以外のすべてのバイト値を含めることができると思われる場合、bash
これを確実に実行するには、NULで区切られた要素のリストを渡し、オプション-z
(sort
非標準ですがGNUソートまたはFreeBSDソートで使用可能)を使用する必要があります。
bash-4.4(2016年9月リリース)では、区切り文字を指定する-d
オプションを組み込みに導入して、作業をより簡単にします。readarray
配列a
を配列で並べ替えますb
。
readarray -td '' b < <(printf '%s\0' "${a[@]}" | sort -z)
配列は安定して整列されます。数値順または逆順(またはサポートされている並べ替え条件)で並べ替えるには-n
、オプションを使用します。-r
sort
sort
関数を実装するにはsortarray
(引数として渡されたすべての配列を名前でソート):
sortarray() for array do
eval '((${#'"$array"'[@]} <= 1))' || readarray -td '' "$array" < <(
eval "printf '%s\0' \"\${$array[@]}\" | sort -z")
done
以前のバージョンでは、ループ内で同じことを実行bash
できます。read -d
b=()
while IFS= read -rd '' item; do b+=("$item"); done < <(
printf '%s\0' "${a[@]}" | sort -z)
機能の場合sortarray
:
sortarray() for array do eval '
tmp=()
while IFS= read -rd "" item; do tmp+=("$item"); done < <(
printf "%s\0" "${'"$array"'[@]}" | sort -z)
'"$array"'=("${tmp[@]}")'
done
扱いにくい
Zshには配列整列機能が組み込まれています。
o
パラメータ拡張フラグを使用して、語彙的に(O
逆順に)ソートできます。n
数値順に並べ替えるためにフラグを追加できます。
$ a=('' 12 2 d é f $'a\nb')
$ printf '<%s>\n' "${(@o)a}"
<>
<12>
<2>
<a
b>
<d>
<é>
<f>
$ printf '<%s>\n' "${(@no)a}"
<>
<2>
<12>
<a
b>
<d>
<é>
<f>
まだ大文字と小文字を区別するソート機能がないロケールでは、これにi
フラグを追加することもできます。
配列に割り当てる:
b=("${(@o)a}")
したがって、sortarray
関数は次のようになります。
sortarray() for array do eval "$array=(\"\${(@o)$array}\")"; done
AT&T ksh
set -s -- "${a[@]}"
b=("$@")
set -s
パラメータリストを並べ替えて、位置パラメータに保存します。順序は語彙的です。
機能はsortarray
次のとおりです。
sortarray() for array do
eval 'set -s -- "${'"$array"'[@]}"; '"$array"'=("$@")'
done