Bash - How to Declare a Local Integer?

Bash - How to Declare a Local Integer?

In Bash, how do I declare a local integer variable, i.e. something like:

func() {
  local ((number = 0)) # I know this does not work
  local declare -i number=0 # this doesn't work either

  # other statements, possibly modifying number
}

Somewhere I saw local -i number=0 being used, but this doesn't look very portable.

2

3 Answers

declare inside a function automatically makes the variable local. So this works:

func() {
    declare -i number=0

    number=20
    echo "In ${FUNCNAME[0]}, \$number has the value $number"
}

number=10
echo "Before the function, \$number has the value $number"
func
echo "After the function, \$number has the value $number"

And the output is:

Before the function, $number has the value 10
In func, $number has the value 20
After the function, $number has the value 10

Per ,

local [option] name[=value] ...

For each argument, a local variable named name is created, and assigned value. The option can be any of the options accepted by declare.

So local -i is valid.

2

In case you end up here with an Android shell script you may want to know that Android is using MKSH and not full Bash, which has some effects. Check this out:

#!/system/bin/sh
echo "KSH_VERSION:  $KSH_VERSION"

local -i aa=1
typeset -i bb=1
declare -i cc=1

aa=aa+1;
bb=bb+1;
cc=cc+1;

echo "No fun:"
echo "  local   aa=$aa"
echo "  typset  bb=$bb"
echo "  declare cc=$cc"

myfun() {
    local -i aaf=1
    typeset -i bbf=1
    declare -i ccf=1

    aaf=aaf+1;
    bbf=bbf+1;
    ccf=ccf+1;

    echo "With fun:"  
    echo "  local   aaf=$aaf"
    echo "  typset  bbf=$bbf"
    echo "  declare ccf=$ccf"
}
myfun;

Running this, we get:

# woot.sh
KSH_VERSION:  @(#)MIRBSD KSH R50 2015/04/19
/system/xbin/woot.sh[6]: declare: not found
No fun:
  local   aa=2
  typset  bb=2
  declare cc=cc+1
/system/xbin/woot.sh[31]: declare: not found
With fun:
  local   aaf=2
  typset  bbf=2
  declare ccf=ccf+1

Thus in Android declare doesn't exist. But reading up, the others should be equivalent.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

David Miller
Author

David Miller

David Miller brings 15 years of experience in global economics, personal finance strategy, and market dynamics. He specializes in turning complex economic trends into actionable insights for everyday readers.