The following seems to work.

$ year=2005
$ foo=$(expr $year - 1900 )
$ dayscount=$(expr $foo \* 365 )
$ echo $dayscount
38325

Problems include an unescaped asterisk
man expr indicates that parentheses should work
        but my playing with them seems to indicate otherwise.
---Correction:
$ dayscount=$(expr \( $year - 1900 \) \* 365 )
$ echo $dayscount
38325

Parens that are destined for expr instead of the shell must also be escaped.




-----Original Message-----
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] Behalf Of
Otto Moerbeek
Sent: Monday, June 27, 2005 2:08 AM
To: Peter Bako
Cc: misc@openbsd.org
Subject: Re: SH programming


On Sun, 26 Jun 2005, Peter Bako wrote:

> Ok, so this is not really an OpenBSD question but I am doing this on an
> OpenBSD system and I am about to lose my mind...
>
> I have done some basic shell scripting before but I've not had to deal
with
> actual integer math before and now it is killing me.  The script takes a
> parameter in (year number) and is supposed to subtract 1900 from it and
then
> multiply the result by 365.  (This is part of a larger script that deal
with
> converting dates to a single numeric value, but this one problem is an
> example of the problems I am having with this entire script.)  So, this is
> what I have:
>
> #!/bin/sh
> month=$1
> day=$2
> year=$3
>
> dayscount=$(expr ($year - 1900) * 365)
> echo $dayscount
> exit
>
> This will generate a "syntax error: `$year' unexpected" error.  I have
tried
> all sorts of variations and I am not getting it!!!  HELP!!!

When using ksh, you can do:

#!/bin/ksh
month=$1
day=$2
year=$3

dayscount=$((($year - 1900) * 365))
echo $dayscount
exit

When using sh, you'll need expr(1), for which all parts of the
expression are separate arguments, and you need to escape all special
shell chars:

#!/bin/sh
month=$1
day=$2
year=$3

dayscount=`expr \( $year - 1900 \) \* 365`
echo $dayscount
exit

> BTW, obviously I need a good book on SH programming.  Any suggestions?

For ksh, the Korn Shell Book by David Korn and (iirc Morris Bolsky)
comes to mind.

        -Otto

Reply via email to