是否可以将内部嵌套的变量设为局部循环


9
#!/bin/bash
for i in  1 2 3 4
do

#   {
#   local i     ##gives error  local: can only be used in a function
    for i in 1 2 3
    do
    echo "inner loop ----- $i"
    (( i++ ))
    done
#   }
echo $i
done

外出:

inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
4
inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
4
inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
4
inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
4

是否有可能使内部嵌套的for循环局部变量。

Answers:


9

如果在子外壳中运行内部变量,则不会影响外部变量:

for i in 1 2 3 4; do
    (
        for i in 1 2 3; do
            echo "inner loop ----- $i"
            (( i++ ))
        done
    )
    echo $i
done

结果是:

inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
1
inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
2
inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
3
inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
4

1
这是有效的,但请不要这样做。一眼就很难阅读。
coteyr

1
过度使用子shell会使脚本明显变慢。
user23013 '16

2
但是,只有那些不滥用subshel​​l的人很难阅读。
user23013 '16

9

是否有可能使内部嵌套的for循环局部变量。

是的,但仅使用功能。

由于内置local函数只能存在于函数内部,因此我们需要提供一个函数来使变量i将范围从全局更改为局部:

#!/bin/bash

internalfunction () {
    local i     ### Works as is inside a function
    for i in 1 2 3; do
        echo "inner loop ----- $i"
        (( i++ ))
    done
}

for i in  1 2 3 4; do
    echo $i
    internalfunction
done

$ ./script.sh
1
inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
2
inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
3
inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
4
inner loop ----- 1
inner loop ----- 2
inner loop ----- 3

1
同样有效,而且更容易阅读。
coteyr

刚刚注意到,仅使用{}就可以使变量declare成为局部变量。使用声明var 也可以使它成为局部变量
废除

1
@munish不,仅{ }是不够的。是的,在函数内部声明一个var local 。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.