intermittent bc parse error

Thought I had this worked out, and the equations work fine on their own.

What I have is an if statement that checks the raw size of a folder. Smaller than a certain threshold and it returns a value in MB format, otherwise it returns it in GBs. Yes, I know that df and du return human readable values, no I do not want to use them because I'm running OS X 10.6 and am trying to maintain the same values the Finder will display.

Also, the reason I'm passing the raw size instead of just using df -gH is that my source might not necessarily be the root directory, it may be just the user's folder.

 
sizeRAW=`df "$source" | awk '{print $3}' | sed s/Used//`   #actually an if statement, uses either df or du to find the size depending upon it being a hard drive or a sub-folder.

if [ $sizeRAW -lt 1757813 ]; then
    
        sizeHUMAN=`echo "scale=2; ($sizeRAW*512)/1000000" | bc | awk '{print $1"M"}'`
    else
        sizeHUMAN=`echo "scale=2; ($sizeRAW*512)/1000000000" | bc | awk '{print $1"G"}'`
    fi

-x debug shows

+ '[' 496454408 -lt 1757813 ']'           
++ echo 'scale=2; (                       
496454408*512)/1000000000'              
++ bc                               
++ awk '{print $1"G"}'                    
(standard_in) 2: parse error               
(standard_in) 2: parse error               
+ sizeHUMAN=                        

The correct values are calculated in sizeRAW, and passed through the if statement and into the calculation for bc to handle. If I enter the same numbers at the command line, I get the correct value. Same is true if I set the value for sizeRAW and pass it to the calculation on the command line. For some reason, the script will occasionally error on this and other similar bc calculations.

Am I formatting the calculation incorrectly? Is there a better more acceptable way to do this?

Hi,

I don't know what fails in your script, but one solution could be doing the operation with awk.

$ sizeRAM=496454408 ; echo $sizeRAM
496454408
$ awk -v ram="$sizeRAM" 'BEGIN { printf "%.2f\n", (ram*512)/1000000 }'
254184.66

Regards,
Birei

The problem is that the df|awk|sed pipeline results in a leading blank line. That's interpreted by bc as the end of a statement.

Instead of awk '{print $3}' | sed s/Used// , you can use awk '!/Used/ {print $3}' or awk 'NR>1 {print $3}' .

On an unrelated note, I would suggest getting out of the habit of using backticks for command subsitution. You have nothing but pain to gain by using that obsolete syntax (the rules for quoting and nested substitutions are arcane and complex). $(...) is a lot simpler and saner.

Regards,
Alister

---------- Post updated at 06:17 PM ---------- Previous update was at 06:01 PM ----------

To minimize repetition, I'd just set some parameters in the if statement. Otherwise, if you need to alter the command pipeline, you'll have to remember to do it more than once.

if [ $sizeRAW -lt 1757813 ]; then
    sdiv=1000000 sunit=M
else
    sdiv=1000000000 sunit=G
fi
sizeHUMAN=$(echo "scale=2; ($sizeRAW*512)/$sdiv" | bc)$sunit

The final awk to append the unit's abbreviation is not necessary. You can simply concatenate it in the shell.

Regards,

Thank you both for your replies. Didn't realize the backticks were deprecated/obsolete. Still see both methods in use on so many of the examples. Love being able to come here and get quick polite accurate responses!