Sem ferramentas GNU e apenas o shell script de trabalho intensivo:
recentdb2 () (
cd /opt/IBM/db2 || return 1
highest=
himajor=
himinor=
hifp=
for dir in V*.*
do
[ ! -d "$dir" ] && continue
nov="${dir#V*}"
major="${nov%%.*}"
notmajor="${nov##*.}"
minor="${notmajor%%fp*}"
if [ "$minor" = "$notmajor" ]
then
# no FP
fp=0
else
fp="${notmajor##*fp}"
fi
# if highest major isn't set, set it and continue
# else compare major; if higher, set it and continue
# else compare minor; if higher, set it and continue
# else compare fp; if higher, set it
if [ "${himajor:-notset}" = "notset" ]
then
highest="$dir"
himajor="$major"
himinor="$minor"
hifp="$fp"
continue
fi
if [ "$major" -gt "$himajor" ]
then
highest="$dir"
himajor="$major"
himinor="$minor"
hifp="$fp"
continue
elif [ "$major" -eq "$himajor" ] && [ "$minor" -gt "$himinor" ]
then
highest="$dir"
himajor="$major"
himinor="$minor"
hifp="$fp"
continue
elif [ "$major" -eq "$himajor" ] && [ "$minor" -eq "$himinor" ] && [ "$fp" -gt "$hifp" ]
then
highest="$dir"
himajor="$major"
himinor="$minor"
hifp="$fp"
fi
# else, the current value is less than the highest value, drop it and continue on
done
printf "%s" "$highest"
)
Isso define uma função que (tentará) retornar o diretório do DB2 de nível mais alto a partir de / opt / IBM / db2.
A função é toda executada em um subshell, de modo que:
- as variáveis criadas desaparecem quando são concluídas e
- o
cd
também é isolado para o subshell
A função então faz um loop sobre as entradas no diretório / opt / IBM / db2 que correspondem ao padrão de glob V*.*
- ajuste isso se você puder ter versões como V11
sem nenhum ponto. O primeiro teste é garantir que não somos enganados por um arquivo perdido que corresponda a esse padrão.
O trabalho começa: nós tiramos o primeiroV
off ("no V"), então computamos:
- o maior número é tudo antes do primeiro período
- o "não maior número" é tudo depois do primeiro período
- o número menor é a parte do "não maior número" até que
fp
- se houver um
fp
no nome (não houve alteração da cadeia completa "não maior número" para o número menor), defina o fp para isso, caso contrário, defina-o como zero
Como os comentários dizem, testamos e definimos as variáveis "altas" apropriadamente. O primeiro diretório que encontrarmos entrará na primeira condição - onde é o nível mais alto por padrão.
Entradas de diretório subseqüentes são então comparadas com as versões maior, menor e fp atualmente mais altas.
Quando o loop estiver completo, a função imprime o nome do diretório mais recente.
Use a função criando um script ou fonte no código e, em seguida, chame a função:
h=$(recentdb2)