Paul L. Snyder on 16 Sep 2009 16:33:36 -0700


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Re: [PLUG] floor/ceil in bash?


On Wed, September 16, 2009, Jason Stelzer"  wrote:

> The details are boring and irritating, but I'm looking to get the ceil
> for something in bash. Here's how I'm brute forcing it.
[...]
> Is there an easier way? And yeah, I know that using _MY_CEIL as a
> bucket is kind of weird. Either way the code looks odd to me.

Bash does not support floating-point math, unless they've done something
sneaky in recent releases that I don't know about.  Trying to make it
do so on your own will only lead to woe.  I haven't traced through your
script, but I'd be pretty suspicious of it.

If you don't want to use a shell that supports floating-point math
(such as zsh), I'd recommend turning to bc at a time like this.

First define a bash function that calls bc.  In bc, "scale" is the number of
positions after the decimal place that are retained after some arithmetic
operations.  By default, scale is 0, so dividing by 1 returns the integer
portion of a number.  The $1 is the first argument to the bash ceil function
being defined.

------
function ceil () {
  echo "define ceil (x) {if (x<0) {return x/1} \
         else {if (scale(x)==0) {return x} \
         else {return x/1 + 1 }}} ; ceil($1)" | bc;
}
------

To stuff a value into an envar, call with command substitution:

  $ X=5.5
  $ CEIL_X=$(ceil x)
  $ echo $CEIL_X
  6

HTH,
Paul
___________________________________________________________________________
Philadelphia Linux Users Group         --        http://www.phillylinux.org
Announcements - http://lists.phillylinux.org/mailman/listinfo/plug-announce
General Discussion  --   http://lists.phillylinux.org/mailman/listinfo/plug