-- Leo's gemini proxy

-- Connecting to thrig.me:1965...

-- Connected

-- Sending request

-- Meta line: 20 text/gemini

Weird Shell Arithmetic


Portability might vary here; these assume ksh on OpenBSD 7.3.


    $ FOO=42 ; echo $((FOO+1))
    43
    $ FOO=42 ; echo $(($FOO+1))
    43

So what's the big deal?


    $ FOO='42+9'
    $ echo $((FOO+1))
    52
    $ echo $(($FOO+1))
    52

Okay maybe if you somehow get arithmetic operators into your supposed-to-be-numeric strings you get some unexpected math. But it's consistent, right?


    $ FOO='1+2'
    $ echo $((FOO*2))
    6
    $ echo $(($FOO*2))
    5

Whoops, that one had an order-of-operation issue.


    $ FOO=0xa ; echo $((FOO-1)) ; echo $(($FOO-1))
    9
    9
    $ FOO=077 ; echo $((FOO-1)) ; echo $(($FOO-1))
    62
    62

Octals and hexadecimal inputs will be acted on.


Probably the FOO='1+2' and similar forms are undefined behavior, and hopefully never show up unexpectedly in a shell script of yours that is trying to math. (I'd sooner switch to some other language.) `typeset -i` might force integer-ness on a variable, but then you have a case where weird input like '1+2' will be silently accepted. Others might prefer the script to blow up so someone can review where the bad input came from.


    $ FOO=1+2
    $ echo $((FOO*2)) $(($FOO*2))
    6 5
    $ typeset -i FOO
    $ echo $((FOO*2)) $(($FOO*2))
    6 6

This is mostly a problem for scripts that process uncontrolled inputs that come from who knows where and contain who knows what and get handled as arithmetic. So probably pretty rare.


https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_04


tags #unix #sh

-- Response ended

-- Page fetched on Tue May 21 16:42:57 2024