É mais fácil se você estiver usando o zsh, graças aos seus qualificadores : [-1]
para manter a última correspondência e n
para usar a classificação numérica para que R9
seja anterior a R10
. Você também pode aproveitar seu padrão <->
glob para corresponder aos números.
last_release=(releases/R<->(n[-1]))
if (($#last_release == 0)); then
echo 1>&2 "Fatal error: no release available"
exit 2
fi
Com apenas ferramentas portáteis, o método mais fácil é transferir a classificação numérica para sort
. Se você tiver apenas nomes de arquivos “domesticados” no diretório releases
(somente caracteres ASCII, sem caracteres de controle, sem espaço em branco), filtrar a saída de ls
é uma maneira prática de gerar a lista de nomes de arquivos. >
set_last_release () {
set -- $(ls releases | sed -n 's/^R\([0-9][0-9]*\)//p' | sort -rn)
if [ $# -eq 0 ]; then
echo 1>&2 "Fatal error: no release available"
exit 2
fi
last_release=releases/R$1
}
Se você usar zeros à esquerda em seus números de lançamento, poderá confiar na classificação interna do shell. Observe que não há uma maneira portátil de corresponder apenas aos nomes de arquivo que consistem em R
seguido por um ou mais dígitos; em ksh, você pode usar releases/R+([0-9])
, e você também pode usar isso no bash se você colocar shopt -s extglob
no início do seu script (ele deve estar em vigor quando a função é analisada e quando é executada). / p>
set_last_release () {
set -- releases/R[0-9]*
if [ "$1" = 'releases/R[0-9]*' ]; then
echo 1>&2 "Fatal error: no release available"
exit 2
fi
eval last_release=\$$#
}