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

前端 未结 29 1651
慢半拍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:13

    function version_compare () {
      function sub_ver () {
        local len=${#1}
        temp=${1%%"."*} && indexOf=`echo ${1%%"."*} | echo ${#temp}`
        echo -e "${1:0:indexOf}"
      }
      function cut_dot () {
        local offset=${#1}
        local length=${#2}
        echo -e "${2:((++offset)):length}"
      }
      if [ -z "$1" ] || [ -z "$2" ]; then
        echo "=" && exit 0
      fi
      local v1=`echo -e "${1}" | tr -d '[[:space:]]'`
      local v2=`echo -e "${2}" | tr -d '[[:space:]]'`
      local v1_sub=`sub_ver $v1`
      local v2_sub=`sub_ver $v2`
      if (( v1_sub > v2_sub )); then
        echo ">"
      elif (( v1_sub < v2_sub )); then
        echo "<"
      else
        version_compare `cut_dot $v1_sub $v1` `cut_dot $v2_sub $v2`
      fi
    }
    
    ### Usage:
    
    version_compare "1.2.3" "1.2.4"
    # Output: <
    

    Credit goes to @Shellman

提交回复
热议问题