jerrygarciuh
jerrygarciuh

Reputation: 21988

Converting string to floating point number without bc in bash shell script

I'm getting load average in a bash shell script like so

load=`echo $(cat /proc/loadavg | awk '{print $1}')`

I know piping to bc

load=`echo $(cat /proc/loadavg | awk '{print $1}') \> 3 | bc -l`

is used in almost all examples of how to cast $load as an int but this box does not have bc installed and I am not allowed to add it.

I tried

int=`perl -E "say $load - 0"`

I tried

int=${load%.*}

I tried

int=`printf -v int %.0f "$load"`

What I want to be able to do is

if [ "$int" -gt  3.5 ]; then

How do I get that to evaluate as intended?

Upvotes: 0

Views: 2094

Answers (2)

ghoti
ghoti

Reputation: 46846

You don't need any external tools (like awk) to read this stuff. Load average from /proc/loadavg is always formatted with two decimal places, so you can do this:

read load _ < /proc/loadavg

if [ ${load/./} -gt 350 ]; then
  # do something
fi

Upvotes: 3

Tom Fenech
Tom Fenech

Reputation: 74605

You can use awk to produce a success/failure depending on the condition:

# exit 0 (success) when load average greater than 3.5, so take the branch
if awk '{ exit !($1 > 3.5) }' /proc/loadavg; then
    # load average was greater than 3.5
fi

Unfortunately, since "success" is 0 in the shell, you have to invert the logic of the condition to make awk exit with the required status. Obviously, you can do this in a number of ways, such as changing > to <=.

Upvotes: 3

Related Questions