I admit the function was mis-named, should be isanumexpr
As @chet noted this attempt was not too bad just need a little $1 check
before pursuing the idea of letting the bash scanner do the job for
complicated valid number (any base)
I come up with this one
function isanum
{ [[ "$1" =~ ^[+-]?[0-9][0-9a-zA-Z#@_]*$ ]] || return 1
(($1)) || (($1==0)) && return 0
return 1
} >/dev/null 2>&1
$ isanum 1+1 && echo y || echo n
n
$ isanum 'i[$( date >&2 )]' && echo y || echo n
n
$ isanum 64#yo && echo y || echo n
y
$ isanum -1 && echo y || echo n
y
$ isanum yo && echo y || echo n
n
$ isanum '' && echo y || echo n
n
$ isanum 0 && echo y || echo n
y
This time the 1st =~ do accept only number characters at large, the
complexity of deciding which [:letter:]@_ is ledgit for a given base is
differed to $(())
Getting closer to the perfect isanum() :-)
Note the I have a full one based only on regex =~ it is real ugly so that's
why I prefere de let $(()) do the scan, specially if one day it accept 0b
as base (unlikely but who knows. This code would still work.
Again modern bash.
Note too that I use function redirection because I got no idea how to nuke
$(( )) syntax error message