2dumb
May 1, 2007, 11:53am
1
Anyone have an idea why this if statement does not work correctly?
"test2.sh" 18 lines, 386 characters
#!/usr/bin/sh
WARNING=80
CRITICAL=95
check_it()
{
if [[ ${1} = ${WARNING} ]] || [[ ${1} -gt ${WARNING} && ${1} -lt ${CRITICAL} ]];then
echo "YES [[ ${1} = ${WARNING} ]] || [[ ${1} -gt ${WARNING} && ${1} -lt ${CRITICAL} ]]"
else
echo "NO [[ ${1} = ${WARNING} ]] || [[ ${1} -gt ${WARNING} && ${1} -lt ${CRITICAL} ]]"
fi
}
check_it 80.1
check_it 81.1
me> test2.sh
NO [[ 80.1 = 80 ]] || [[ 80.1 -gt 80 && 80.1 -lt 95 ]]
YES [[ 81.1 = 80 ]] || [[ 81.1 -gt 80 && 81.1 -lt 95 ]]
The following works.
Compare this version with your version and see what the problems were.
#!/usr/bin/sh
WARNING=80
CRITICAL=95
check_it()
{
if [ ${1} -eq ${WARNING} -o \( ${1} -gt ${WARNING} -a ${1} -lt ${CRITICAL} \) ];
then
echo "YES [[ ${1} -eq ${WARNING} ]] || [[ ${1} -gt ${WARNING} && ${1} -lt ${CRIT
ICAL} ]]"
else
echo "NO [[ ${1} -eq ${WARNING} ]] || [[ ${1} -gt ${WARNING} && ${1} -lt ${CRITI
CAL} ]]"
fi
}
check_it 79.7
check_it 80.0
check_it 80.1
check_it 81.1
The standard shell cannot do floating point comparisons or arithmetic. You need to use ksh93.
2dumb
May 3, 2007, 2:38pm
4
Thanks Shell_Life,
It seems all I needed to do is change my test from "=" to "-eq".
cfajohnson,
You are also correct if I try to compare to 80.1 instead of a whole number then it returns untrue results (see below). However I will only use whole numbers so I should be ok.
me> cat test2.sh
#!/usr/bin/sh
WARNING=80
CRITICAL=95
check_it_before()
{
if [[ ${1} = ${WARNING} ]] || [[ ${1} -gt ${WARNING} && ${1} -lt ${CRITICAL} ]];then
echo "TRUE [[ ${1} = ${WARNING} ]] || [[ ${1} -gt ${WARNING} && ${1} -lt ${CRITICAL} ]]"
else
echo "FALSE [[ ${1} = ${WARNING} ]] || [[ ${1} -gt ${WARNING} && ${1} -lt ${CRITICAL} ]]"
fi
}
check_it_after()
{
if [[ ${1} -eq ${WARNING} ]] || [[ ${1} -gt ${WARNING} && ${1} -lt ${CRITICAL} ]];then
echo "TRUE [[ ${1} -eq ${WARNING} ]] || [[ ${1} -gt ${WARNING} && ${1} -lt ${CRITICAL} ]]"
else
echo "FALSE [[ ${1} -eq ${WARNING} ]] || [[ ${1} -gt ${WARNING} && ${1} -lt ${CRITICAL} ]]"
fi
}
echo Before
check_it_before 79.9
check_it_before 80.0
check_it_before 80.1
check_it_before 94.4
check_it_before 95.0
check_it_before 95.1
echo "\nAfter"
check_it_after 79.9
check_it_after 80.0
check_it_after 80.1
check_it_after 94.9
check_it_after 95.0
check_it_after 95.1
me> test2.sh
Before
FALSE [[ 79.9 = 80 ]] || [[ 79.9 -gt 80 && 79.9 -lt 95 ]]
FALSE [[ 80.0 = 80 ]] || [[ 80.0 -gt 80 && 80.0 -lt 95 ]]
FALSE [[ 80.1 = 80 ]] || [[ 80.1 -gt 80 && 80.1 -lt 95 ]]
TRUE [[ 94.4 = 80 ]] || [[ 94.4 -gt 80 && 94.4 -lt 95 ]]
FALSE [[ 95.0 = 80 ]] || [[ 95.0 -gt 80 && 95.0 -lt 95 ]]
FALSE [[ 95.1 = 80 ]] || [[ 95.1 -gt 80 && 95.1 -lt 95 ]]
After
FALSE [[ 79.9 -eq 80 ]] || [[ 79.9 -gt 80 && 79.9 -lt 95 ]]
TRUE [[ 80.0 -eq 80 ]] || [[ 80.0 -gt 80 && 80.0 -lt 95 ]]
TRUE [[ 80.1 -eq 80 ]] || [[ 80.1 -gt 80 && 80.1 -lt 95 ]]
TRUE [[ 94.9 -eq 80 ]] || [[ 94.9 -gt 80 && 94.9 -lt 95 ]]
FALSE [[ 95.0 -eq 80 ]] || [[ 95.0 -gt 80 && 95.0 -lt 95 ]]
FALSE [[ 95.1 -eq 80 ]] || [[ 95.1 -gt 80 && 95.1 -lt 95 ]]
Note when I try to compare to 80.1 instead of a whole number then it returns untrue results.
After
FALSE [[ 79.9 -eq 80.1 ]] || [[ 79.9 -gt 80.1 && 79.9 -lt 95 ]]
TRUE [[ 80.0 -eq 80.1 ]] || [[ 80.0 -gt 80.1 && 80.0 -lt 95 ]]
TRUE [[ 80.1 -eq 80.1 ]] || [[ 80.1 -gt 80.1 && 80.1 -lt 95 ]]
TRUE [[ 94.9 -eq 80.1 ]] || [[ 94.9 -gt 80.1 && 94.9 -lt 95 ]]
FALSE [[ 95.0 -eq 80.1 ]] || [[ 95.0 -gt 80.1 && 95.0 -lt 95 ]]
FALSE [[ 95.1 -eq 80.1 ]] || [[ 95.1 -gt 80.1 && 95.1 -lt 95 ]]