简体   繁体   中英

How to compare negative values with awk command in Bash?

#!bin/bash

d1=-7
d2=-2

if (( $(awk 'BEGIN {print ("'$d1'" >= "'$d2'")}') )); then
    echo "yes"
    echo "$d1 >= $d2"
else
    echo "no"
fi

Why do I got?

yes
-7 >= -2

Thank

You can't simply use shell variables by using $variable_name in awk . You should initialize an awk variable eg--> -v var="$shell_variable" then you could make use of shell variable's values in awk code. Try following awk :

awk -v d1="$d1" -v d2="$d2" 'BEGIN{if(d1>=d2){print "yes";} else {print "no"}}'

这是使用bc -l比较浮点数的较短命令:

[[ $(bc -l <<< "$d1 >= $d2") -eq 1 ]] && echo "yes" || echo "no"

The double quotes cause awk to perform string comparison, and -7 is lexicographically greater than -2 , since 7 comes after 2 .

You simply need to invert the single and double quotes so that the double quotes are used by the shell when expanding the variables. That is, instead of

if (( $(awk 'BEGIN {print ("'$d1'" >= "'$d2'")}') )); then

use

if (( $(awk 'BEGIN {print ('"$d1"' >= '"$d2"')}') )); then

However, passing the values into proper awk variables with the -v option is still a better idea.

No need to do any additional numerical calculation in shell, just let awk set the appropriate exit status and test it with a simple shell if :

$ cat tst.sh
d1=$1
d2=$2

if $( awk -v d1="$d1" -v d2="$d2" 'BEGIN{exit (d1 >= d2 ? 0 : 1)}' ); then
    echo "yes"
    echo "$d1 >= $d2"
else
    echo "no"
fi

$ ./tst.sh -0.5 -0.409
no

$ ./tst.sh -0.5 -0.500
yes
-0.5 >= -0.500

$ ./tst.sh -0.5 -0.501
yes
-0.5 >= -0.501

Use just bash :

#!/usr/bin/bash

d1=-7
d2=-2

if (( d1 >= d2 )); then
   echo "yes"
else
   echo "no"
fi

For floats:

#!/usr/bin/bash

d1=-7.6
d2=-2.3

if [ "$(echo ${d1}'>='${d2} | bc -l)" = "1" ]; then
   echo "yes"
else
   echo "no"
fi

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM