2012-06-25 25 views
7

Trong Bash, làm cách nào để khai báo một biến số nguyên địa phương, ví dụ: một cái gì đó như:bash - Làm cách nào để khai báo số nguyên cục bộ?

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 
} 

Một nơi nào đó tôi thấy local -i number=0 được sử dụng, nhưng điều này không trông rất cầm tay.

+0

Bạn có ý nghĩa gì về nền tảng độc lập? Các nội trang của Bash giống nhau ở mọi nơi. –

+0

@larsmans Sry, có nghĩa là di động. – helpermethod

Trả lời

10

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

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

Đối với mỗi đối số, một biến địa phương tên là tên được tạo ra, và giá trị giao. Tùy chọn có thể là bất kỳ tùy chọn nào được chấp nhận bởi khai báo.

Vì vậy, local -i là hợp lệ.

+0

+1 Không biết nó chấp nhận các tùy chọn giống như khai báo. – helpermethod

+1

'local' từng là một bí danh để' khai báo', do đó, nó không phải là đáng ngạc nhiên (trên vỏ Korn nó vẫn là một bí danh để 'typedef'). – cdarke

9

declare bên trong một hàm sẽ tự động biến biến cục bộ. Vì vậy, công trình này:

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" 

Và kết quả là:

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

Trong trường hợp bạn kết thúc ở đây với một kịch bản shell Android, bạn có thể muốn biết rằng Android đang sử dụng MKSH và không đầy đủ Bash, mà có một số hiệu ứng. 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; 

Chạy này, chúng tôi nhận được:

# 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 

Như vậy trong Androiddeclare không tồn tại. Nhưng đọc lên, những người khác nên tương đương.

Các vấn đề liên quan