我对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;。
非常感谢您的所有答案! :)
答案 0 :(得分:2)
Shell没有循环控制变量的概念。所有变量都是全局变量,除非它们声明的函数是本地的,通常使用local
关键字。
有些shell具有动态作用域,这意味着如果被调用者没有使用自己的局部变量来掩盖它,则调用者可以访问其调用者中的局部变量。
在您的示例中,所有这些都无关紧要。 for
语句只写入变量。他们不读它。当loop
返回时,来电者的for
会从中断处继续。
答案 1 :(得分:0)
每个for…in
语句都有一个隐式的本地状态(我不会调用变量,因为它没有名称,也没有办法检查它)。这个本地状态由完全评估的单词列表的未消耗部分组成,以便迭代。