How to compare two strings in dot separated version format in Bash?

前端 未结 29 1654
慢半拍i
慢半拍i 2020-11-22 06:52

Is there any way to compare such strings on bash, e.g.: 2.4.5 and 2.8 and 2.4.5.1?

29条回答
  •  刺人心
    刺人心 (楼主)
    2020-11-22 07:20

    You can recursively split on . and compare as shown in the following algorithm, taken from here. It returns 10 if the versions are the same, 11 if version 1 is greater than version 2 and 9 otherwise.

    #!/bin/bash
    do_version_check() {
    
       [ "$1" == "$2" ] && return 10
    
       ver1front=`echo $1 | cut -d "." -f -1`
       ver1back=`echo $1 | cut -d "." -f 2-`
    
       ver2front=`echo $2 | cut -d "." -f -1`
       ver2back=`echo $2 | cut -d "." -f 2-`
    
       if [ "$ver1front" != "$1" ] || [ "$ver2front" != "$2" ]; then
           [ "$ver1front" -gt "$ver2front" ] && return 11
           [ "$ver1front" -lt "$ver2front" ] && return 9
    
           [ "$ver1front" == "$1" ] || [ -z "$ver1back" ] && ver1back=0
           [ "$ver2front" == "$2" ] || [ -z "$ver2back" ] && ver2back=0
           do_version_check "$ver1back" "$ver2back"
           return $?
       else
               [ "$1" -gt "$2" ] && return 11 || return 9
       fi
    }    
    
    do_version_check "$1" "$2"
    

    Source

提交回复
热议问题