Se as strings não contiverem novas linhas, o seguinte deverá funcionar. Ele classifica os índices do array pelo comprimento, usando as próprias strings como critério secundário de classificação.
#!/bin/bash
array=(
"tiny string"
"the longest string in the list"
"middle string"
"medium string"
"also a medium string"
"short string"
)
expected=(
"the longest string in the list"
"also a medium string"
"medium string"
"middle string"
"short string"
"tiny string"
)
indexes=( $(
for i in "${!array[@]}" ; do
printf '%s %s %s\n' $i "${#array[i]}" "${array[i]}"
done | sort -nrk2,2 -rk3 | cut -f1 -d' '
))
for i in "${indexes[@]}" ; do
sorted+=("${array[i]}")
done
diff <(echo "${expected[@]}") \
<(echo "${sorted[@]}")
Observe que a mudança para uma linguagem de programação real pode simplificar bastante a solução, por exemplo, em Perl, você pode apenas
sort { length $b <=> length $a or $a cmp $b } @array