gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:07:01 25 4
gpt4 key购买 nike

我对 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 语句只写入变量。他们不读它。当 loop 返回时,调用者的 for 从中断处继续。

关于linux - shell中for循环控制变量的范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44737920/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com