我有一个关于 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 循环列表有点困惑,它的行为就像“局部变量”。
非常感谢您的所有回答! :)
最佳答案
Shell 没有循环控制变量的概念。所有变量都是全局变量,除非它们声明为函数局部变量,通常使用 local
关键字。
某些 shell 具有动态作用域,这意味着被调用者可以访问其调用者中的局部变量(如果它不使用自己的局部变量覆盖它)。
不过,在您的示例中,所有这些都是无关紧要的。 for
语句仅写入变量。他们不读。当循环
返回时,调用者的for
从中断处继续。
关于linux - shell中for循环控制变量的范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44737920/