shell中for循环控制变量的范围?

时间:2017-06-24 15:20:12

标签: linux bash shell unix sh

我对shell中的for循环有疑问。

让我们假设这个简单的shell脚本:

#!/bin/sh
loop() {                                                                                                                                                                                                                                                                                                               
    for i in 1 2 3 4; do                                                                                                                                           
        if [ $i -eq 2 ]; then                                                                                                                                      
            [ $1 -eq 2 ] && return 1                                                                                                                           
            loop $(($1 + 1)) && return 1                                                                                                                     
        fi                                                                                                                                                         
    done                                                                                                                                                           
return 1                                                                                                                                                       
}                                                                                                                                                                  

loop 0       

除参数(和函数参数)外,所有变量都是全局变量。所以,如果我想在函数中使用局部变量 我必须将其作为论据传递。

我尝试运行这个简单的脚本,但我不确定for循环列表(本例中为1 2 3 4)是否也是本地的? 见下文:

+ loop 0
+ for i in 1 2 3 4
+ '[' 1 -eq 2 ']'
+ for i in 1 2 3 4
+ '[' 2 -eq 2 ']'
+ '[' 0 -eq 2 ']'
+ loop 1
+ for i in 1 2 3 4
+ '[' 1 -eq 2 ']'
+ for i in 1 2 3 4
+ '[' 2 -eq 2 ']'
+ '[' 1 -eq 2 ']'
+ loop 2
+ for i in 1 2 3 4
+ '[' 1 -eq 2 ']'
+ for i in 1 2 3 4
+ '[' 2 -eq 2 ']'
+ '[' 2 -eq 2 ']'
+ return 1
+ for i in 1 2 3 4
+ '[' 3 -eq 2 ']'
+ for i in 1 2 3 4
+ '[' 4 -eq 2 ']'   <- here is $i == 4
+ return 1
+ for i in 1 2 3 4
+ '[' 3 -eq 2 ']'   <- here is $i == 3, correctly behaving as local variable ...
+ for i in 1 2 3 4
+ '[' 4 -eq 2 ']'
+ return 1

任何人都可以告诉我,for循环如何在内部工作?我对for循环列表感到有点困惑,就像&#34;局部变量&#34;。

非常感谢您的所有答案! :)

2 个答案:

答案 0 :(得分:2)

Shell没有循环控制变量的概念。所有变量都是全局变量,除非它们声明的函数是本地的,通常使用local关键字。

有些shell具有动态作用域,这意味着如果被调用者没有使用自己的局部变量来掩盖它,则调用者可以访问其调用者中的局部变量。

在您的示例中,所有这些都无关紧要。 for语句只写入变量。他们不读它。当loop返回时,来电者的for会从中断处继续。

答案 1 :(得分:0)

每个for…in语句都有一个隐式的本地状态(我不会调用变量,因为它没有名称,也没有办法检查它)。这个本地状态由完全评估的单词列表的未消耗部分组成,以便迭代。