intermittent bc parse error


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting intermittent bc parse error
# 1  
Old 08-22-2011
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.



Code:
 
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

Code:
+ '[' 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?
# 2  
Old 08-22-2011
Hi,

I don't know what fails in your script, but one solution could be doing the operation with awk.
Code:
$ sizeRAM=496454408 ; echo $sizeRAM
496454408
$ awk -v ram="$sizeRAM" 'BEGIN { printf "%.2f\n", (ram*512)/1000000 }'
254184.66

Regards,
Birei
# 3  
Old 08-22-2011
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 ----------

Quote:
Originally Posted by reid
Code:
 
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

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.

Code:
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,
# 4  
Old 08-22-2011
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!
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Intermittent "cp: cannot stat" error with nested loop

I have a bash script that has been running (on SUSE 9.3) dozens of times over the past couple of years without error. Recently it has been hitting intermittent “cp: cannot stat FILE: No such file or directory” errors. The script has nested loops that continuously process files in a... (2 Replies)
Discussion started by: jcart
2 Replies

2. HP-UX

Intermittent NFS server

Hello everybody! I have a HP rx-5670 box with HP-UX 11i version 1.6 installed on it. I also have a NetApp FAS 250 working as a NFS server. I installed oracle 9i engine in my HP box while the database on the FAS 250. During these few months, my oracle server randomly got offline due to weird... (4 Replies)
Discussion started by: jembalang
4 Replies

3. HP-UX

[Solved] Help with intermittent ping issue

We recently stood up a new server running HP-UX 11.31. Every time we do a restart we lose connectivity to the server. Can't ping in or out. I did some troubleshooting and the problem gets resolved temporarily(can ping in and out and putty to it) when we disconnect the network cable and reconnect... (4 Replies)
Discussion started by: DtbCollumb
4 Replies

4. AIX

RSH intermittent error rshd: 0826-813 Permission is denied.

I am getting an error from one node in a set with RSH setup between them, node one will connect to node two every other time (consistently), however node to connects to node one every time without problem. Here is what I am seeing, makes no sense to me. Can anyone help? sbhcprdb01<root>: rsh... (6 Replies)
Discussion started by: JodyTek
6 Replies

5. Shell Programming and Scripting

bc giving error: (standard_in) 2: parse error

Below part of script, is working fine sometimes and gives error sometime. I am doing float operations, checking if x > y. ##########CODE########## THRESHOLD="1.25" ratio=$( echo "scale=2; ${prev}/${current}" | bc ) if ; then split_date=`echo ${line} | cut -d, -f2` fi ... (9 Replies)
Discussion started by: manishma71
9 Replies

6. HP-UX

Intermittent Network Issue

I have some issues to look at to do with reported network problems. We have had reports of intermittent connection issue between 2 servers when trying to access an Oracle Dbase. And I have been asked to check the hardware to see if it's a server issue or not. I have done some basic checks using... (3 Replies)
Discussion started by: Andyp2704
3 Replies

7. Solaris

Intermittent internet connectivity

Hello, I am a relative UNIX newbie and we are unable to get out to the internet past the router. I can ping everything within the network but can't get out on a consistent basis. The UNIX DBA was let go recently and I have had to step in and assume his duties. Unfortunately, I am not quite... (1 Reply)
Discussion started by: judo42
1 Replies

8. Solaris

Intermittent Connection and Samba problem

Hi all , I just installed a Solaris10 on x86 machine , running on vmware . I was able to telnet from my local machine to the solaris ( the one running on the vmware) , but the connection was pretty slow and intermittent . Is there any setting that I should customize to ensure the telnet... (2 Replies)
Discussion started by: osca7578
2 Replies

9. UNIX for Dummies Questions & Answers

Intermittent Printer connection failure

Hi There What causes the remote printers on unix to loose its connections to the Unix server Sco 6 Version 7 When pinging the print server from unix is comes up with host not connected, but after a few moments the ping reply is positive Then we do a disable and enable of the said printer... (0 Replies)
Discussion started by: esh
0 Replies

10. UNIX for Advanced & Expert Users

FTP Problem (Intermittent)

I am having problem with ftp not indicating any error, but my customer is complaining that their response file is not present on their machine. This only happens a couple of times a day. Is there a debugging option I can turn on to the trace the ftp command. I have a return code displayed and it... (2 Replies)
Discussion started by: rob11g
2 Replies
Login or Register to Ask a Question