2012-06-25 20 views
7

En Bash, ¿cómo declarar una variable entera locales, es decir, algo así como:bash - ¿Cómo declarar un entero local?

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 
} 

En algún lugar vi local -i number=0 siendo utilizado, pero esto no se ve muy portátil.

+0

¿Qué quiere decir con plataforma independiente? Los builtins de Bash son iguales en todas partes. –

+0

@larsmans Sry, significa portátil. – helpermethod

Respuesta

10

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

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

Para cada argumento, se crea una variable local llamada nombre, y el valor asignado. La opción puede ser cualquiera de las opciones aceptadas por declarar.

So local -i es válido.

+0

+1 No sabía que acepta las mismas opciones que declarar. – helpermethod

+1

'local' solía ser un alias de' declare', por lo que no es sorprendente (en el shell Korn todavía es un alias de 'typedef'). – cdarke

9

declare dentro de una función hace que la variable sea automáticamente local. Por lo que este funciona:

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" 

Y la salida es:

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

En caso de que terminan aquí con un script de shell Android es posible que desee saber que Android está utilizando mksh y no Bash completo, lo cual tiene algunos efectos Mira esto:

#!/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; 

La ejecución de este, obtenemos:

# 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 

Así, en Androiddeclare no existe. Pero leyendo, los otros deberían ser equivalentes.

Cuestiones relacionadas