Bash: comparação da versão da string

Enquanto estava escrevendo um script de shell em bash, tive o caso em que deveria gerar um caminho baseado na versão do kernel da máquina atual.

Minha necessidade é a seguinte:

  • Se a versão do kernel for inferior a 3.7.0, retorne 3.6
  • Se a versão do kernel for> = 3.7.0 e <3.8.0, retorne 3.7
  • Se a versão do kernel for> = 3.8.0 e <3.9.0, retorne 3.8
  • Se a versão do kernel for> = 3.9.0, retorne 3.9

Eu encontrei uma resposta no Stackoverflow ( http://stackoverflow.com/a/4024263/1996540 ), mas isso não estava funcionando o tempo todo.
Depois de entender como está funcionando, eu atualizei o código e agora está funcionando perfeitamente!

Então, estou compartilhando com o mundo 🙂

verlte() {
[ "$1" = "$2" ] && return 1 || [ "$2" = "`echo -e "$1n$2" | sort -V | head -n1`" ]
}

verlt
() {
[ "$1" = "$2" ] && return 1 || verlte $2 $1
}

check_version
()
{
verlt $CURRENT_KERNEL_VERSION_SHORT
3.7.0 && echo "Kernel version $CURRENT_KERNEL_VERSION_SHORT is < 3.7.0"
[[ "$CURRENT_KERNEL_VERSION_SHORT" == 3.7.* ]] && echo "Kernel version $CURRENT_KERNEL_VERSION_SHORT is ~> 3.7.0"
[[ "$CURRENT_KERNEL_VERSION_SHORT" == 3.8.* ]] && echo "Kernel version $CURRENT_KERNEL_VERSION_SHORT is ~> 3.8.0"
verlte $CURRENT_KERNEL_VERSION_SHORT
3.9.0 && echo "Kernel version $CURRENT_KERNEL_VERSION_SHORT is > 3.9.0"
}

Vamos agora testar um pouco:

CURRENT_KERNEL_VERSION_SHORT="3.6.9" && check_version
#=> Kernel version 3.6.9 is < 3.7.0
CURRENT_KERNEL_VERSION_SHORT="3.7.0" && check_version
#=> Kernel version 3.7.0 is ~> 3.7.0
CURRENT_KERNEL_VERSION_SHORT="3.8.1" && check_version
#=> Kernel version 3.8.1 is ~> 3.8.0
CURRENT_KERNEL_VERSION_SHORT="3.9.5" && check_version
#=> Kernel version 3.9.5 is > 3.9.0
CURRENT_KERNEL_VERSION_SHORT="3.10.1" && check_version
#=> Kernel version 3.10.1 is > 3.9.0