helpermethod
helpermethod

Reputation: 62244

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.

Upvotes: 23

Views: 38456

Answers (3)

not2qubit
not2qubit

Reputation: 17017

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.

Upvotes: 3

Dennis Williamson
Dennis Williamson

Reputation: 360345

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

Upvotes: 38

ecatmur
ecatmur

Reputation: 157414

Per http://www.gnu.org/software/bash/manual/bashref.html#Bash-Builtins,

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.

Upvotes: 26

Related Questions