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

mun*_*ish 9 shell variable

#!/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
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)

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

小智 10

是否可以将嵌套 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
Run Code Online (Sandbox Code Playgroud)
$ ./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
Run Code Online (Sandbox Code Playgroud)

  • 也是有效的,而且更容易阅读。 (2认同)
  • @munish 不,只有 `{ }` 是不够的。是的,声明使 var 成为本地*在函数内部*。 (2认同)

joe*_*epd 9

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

for i in 1 2 3 4; do
    (
        for i in 1 2 3; do
            echo "inner loop ----- $i"
            (( i++ ))
        done
    )
    echo $i
done
Run Code Online (Sandbox Code Playgroud)

结果是:

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
Run Code Online (Sandbox Code Playgroud)

  • 这是有效的,但请不要。一目了然,这使得阅读起来更加困难。 (2认同)
  • 但是,只有那些不滥用 subshel​​l 的人才能阅读它。 (2认同)