I’m certain there’s a more elegant way to do this, but I couldn’t find it. I needed to sort a Bash array of strings by the length of each element without getting too verbose. Here’s what I came out with:

declare -a arr=( s sho sh short l loooooong )
IFS=$'\n' GLOBIGNORE='*' sorted_arr=($(printf '%s\n' ${arr[@]} | awk '{ print length($0) " " $0; }' | sort -n | cut -d ' ' -f 2-))

Now the sorted_arr variable contains an array of elements from arr sorted by line length in ascending order:

$ echo ${sorted_arr[@]}
l s sh sho short loooooong

$ printf '%s\n' ${sorted_arr[@]}
l
s
sh
sho
short
loooooong

If you want to reverse the order, just change the sort -n section of the oneliner to sort -r -n (reverse).

By the way, this is from a quick change I made to Reiki (v1.1.3 is up) that allows it to assume that the shortest match is the most likely when testing multiple fuzzy matches. Just in case you cared…