Comparing numbers in Bash

前端 未结 8 1722
栀梦
栀梦 2020-11-22 02:03

I\'m starting to learn about writing scripts for the bash terminal, but I can\'t work out how to get the comparisons to work properly. The script I\'m using is:



        
8条回答
  •  醉话见心
    2020-11-22 02:36

    This code can also compare floats. It is using awk (it is not pure bash), however this shouldn't be a problem, as awk is a standard POSIX command that is most likely shipped by default with your operating system.

    $ awk 'BEGIN {return_code=(-1.2345 == -1.2345) ? 0 : 1; exit} END {exit return_code}'
    $ echo $?
    0
    $ awk 'BEGIN {return_code=(-1.2345 >= -1.2345) ? 0 : 1; exit} END {exit return_code}'
    $ echo $?
    0
    $ awk 'BEGIN {return_code=(-1.2345 < -1.2345) ? 0 : 1; exit} END {exit return_code}'
    $ echo $?
    1
    $ awk 'BEGIN {return_code=(-1.2345 < 2) ? 0 : 1; exit} END {exit return_code}'
    $ echo $?
    0
    $ awk 'BEGIN {return_code=(-1.2345 > 2) ? 0 : 1; exit} END {exit return_code}'
    $ echo $?
    

    To make it shorter for use, use this function:

    compare_nums()
    {
       # Function to compare two numbers (float or integers) by using awk.
       # The function will not print anything, but it will return 0 (if the comparison is true) or 1
       # (if the comparison is false) exit codes, so it can be used directly in shell one liners.
       #############
       ### Usage ###
       ### Note that you have to enclose the comparison operator in quotes.
       #############
       # compare_nums 1 ">" 2 # returns false
       # compare_nums 1.23 "<=" 2 # returns true
       # compare_nums -1.238 "<=" -2 # returns false
       #############################################
       num1=$1
       op=$2
       num2=$3
       E_BADARGS=65
    
       # Make sure that the provided numbers are actually numbers.
       if ! [[ $num1 =~ ^-?[0-9]+([.][0-9]+)?$ ]]; then >&2 echo "$num1 is not a number"; return $E_BADARGS; fi
       if ! [[ $num2 =~ ^-?[0-9]+([.][0-9]+)?$ ]]; then >&2 echo "$num2 is not a number"; return $E_BADARGS; fi
    
       # If you want to print the exit code as well (instead of only returning it), uncomment
       # the awk line below and comment the uncommented one which is two lines below.
       #awk 'BEGIN {print return_code=('$num1' '$op' '$num2') ? 0 : 1; exit} END {exit return_code}'
       awk 'BEGIN {return_code=('$num1' '$op' '$num2') ? 0 : 1; exit} END {exit return_code}'
       return_code=$?
       return $return_code
    }
    
    $ compare_nums -1.2345 ">=" -1.2345 && echo true || echo false
    true
    $ compare_nums -1.2345 ">=" 23 && echo true || echo false
    false
    

提交回复
热议问题