Em zsh é tão fácil quanto
array=(*.sh(Nom))
O qualificador de glob om faz com que as correspondências sejam classificadas por tempo de modificação (mais recente primeiro), e N força a matriz a ficar vazia se não houver correspondência (em vez de causar um erro).
Em outros shells como o bash, não há uma boa maneira de classificar pelo tempo. Você pode usar ls -t , mas isso pode ser interrompido porque a saída é ambígua. Se você sabe que seus nomes de arquivos contêm apenas caracteres que ls considera imprimíveis e que não são espaços em branco ou \[*? , você pode usar uma substituição de comando:
array=($(ls -t -- *.sh 2>/dev/null))
Você pode tornar isso mais robusto protegendo caracteres curinga e espaço em branco horizontal, mas novas linhas e caracteres não imprimíveis continuam sendo um problema.
IFS=$'\n'; set -f
array=($(ls -t -- *.sh 2>/dev/null))
unset IFS; set +f
Exceto em zsh, não se esqueça das aspas duplas ao se referir ao valor de uma variável, bem como -- para proteger arquivos cujo nome começa com um traço e seriam interpretados como opções, por exemplo rm -- "${array[0]}"