readarray -t array < <(
for str in "${array[@]}"; do
    printf '%d\t%s\n' "${#str}" "$str"
done | sort -k 1,1nr -k 2 | cut -f 2- )
これは、プロセス置換からソートされた配列の値を読み取ります。
プロセス置換にはループが含まれています。ループは、要素の長さとその間のタブ文字が前に付加された配列の各要素を出力します。
ループの出力は、最大から最小に数値ソート(およびアルファベット長さが同じである場合、使用される-k 2rの代わりに-k 2アルファベット順を逆にする)の結果それに送信されるcut文字列の長さを有するカラムを削除しています。
テストスクリプトの後にテスト実行を並べ替えます。
array=(
    "tiny string"
    "the longest string in the list"
    "middle string"
    "medium string"
    "also a medium string"
    "short string"
)
readarray -t array < <(
for str in "${array[@]}"; do
    printf '%d\t%s\n' "${#str}" "$str"
done | sort -k 1,1nr -k 2 | cut -f 2- )
printf '%s\n' "${array[@]}"
$ bash script.sh
the longest string in the list
also a medium string
medium string
middle string
short string
tiny string
これは、文字列に改行が含まれていないことを前提としています。最近のを使用するGNUシステムではbash、改行の代わりにヌル文字をレコード区切りとして使用することにより、データに埋め込まれた改行をサポートできます。
readarray -d '' -t array < <(
for str in "${array[@]}"; do
    printf '%d\t%s\0' "${#str}" "$str"
done | sort -z -k 1,1nr -k 2 | cut -z -f 2- )
ここでは、データは\0ループの末尾に改行ではなく印刷され、sortとcutは-zGNUオプションを介してヌル区切りの行をreadarray読み取り、最後にでヌル区切りのデータを読み取ります-d ''。