From owner-freebsd-questions@FreeBSD.ORG Thu Sep 30 20:48:09 2004 Return-Path: Delivered-To: freebsd-questions@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id E0A8E16A4CE for ; Thu, 30 Sep 2004 20:48:09 +0000 (GMT) Received: from dan.emsphone.com (dan.emsphone.com [199.67.51.101]) by mx1.FreeBSD.org (Postfix) with ESMTP id 968EC43D39 for ; Thu, 30 Sep 2004 20:48:09 +0000 (GMT) (envelope-from dan@dan.emsphone.com) Received: (from dan@localhost) by dan.emsphone.com (8.12.11/8.12.11) id i8UKm9Jl058662; Thu, 30 Sep 2004 15:48:09 -0500 (CDT) (envelope-from dan) Date: Thu, 30 Sep 2004 15:48:09 -0500 From: Dan Nelson To: Andrew Message-ID: <20040930204808.GE22530@dan.emsphone.com> References: <000601c4a720$99264270$4611a8c0@SATPC> <20040930194001.GD22530@dan.emsphone.com> <004901c4a729$61fc7810$4611a8c0@SATPC> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <004901c4a729$61fc7810$4611a8c0@SATPC> X-OS: FreeBSD 5.3-BETA5 X-message-flag: Outlook Error User-Agent: Mutt/1.5.6i cc: freebsd-questions@freebsd.org Subject: Re: 64-bit arithmetic in scripts? X-BeenThere: freebsd-questions@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: User questions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 30 Sep 2004 20:48:10 -0000 In the last episode (Oct 01), Andrew said: > Thanks! I haven't thought about using expr. > > How come that my expr(1) manpage has nothing to say about -e option? > In fact my expr(1) does not accept it. I have FreeBSD 4.10. I've just > looked into a current manpage from www.freebsd.org, and it says > something about 4.x compatibility. > > What is the best way to go if I need to write scripts now, but I'm > planning to switch to 5.x later? Can I upgrade expr(1) now? If not, > what should I do? In 4.x, expr does 64-bit math by default. Apparently POSIX requires that expr use whatever the systems' "signed long" size is, so the default was changed for 5.x, and -e was added to get the old behaviour. If you want your script to work on both, you'll have to do a feature test. I started out just testing expr and expr -e, but it sort of grew... The following script will check the shell's math, two ways of calling expr, and finally fall back on calling bc. As long as you just use the basic math operators, quote your "*"'s, and put spaces between everything, all the methods should be compatible, and your script will work on any bourne-compatible shell :) #! /bin/sh if [ x$(( 65536 * 65536 )) = "x4294967296" ] ; then shellarith() { echo $(( $@ )) ; } MATH="shellarith" else if [ x`expr 65536 "*" 65536` = "x4294967296" ] ; then MATH="expr" else if [ x`expr -e 65536 "*" 65536 2>/dev/null` = x"4294967296" ] ; then MATH="expr -e" else if [ x`echo 65536 "*" 65536 | bc` = "x4294967296" ] ; then bcfunc() { echo "$@" | bc ; } MATH="bcfunc" else echo "Can't do 64-bit math noway nohow" fi fi fi fi echo "Using $MATH" bigval=`$MATH 65536 "*" 65536` echo $bigval -- Dan Nelson dnelson@allantgroup.com