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

标签 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 循环列表有点困惑,它的行为就像“局部变量”。

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

最佳答案

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

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

不过,在您的示例中,所有这些都是无关紧要的。 for 语句仅写入变量。他们不读。当循环返回时,调用者的for从中断处继续。

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

相关文章:

linux - 如何记录 bash 脚本中启动的作业的 pid

c - 使用C语言在自定义shell中进行箭头键控制

python - 在不使用 top 命令的情况下以百分比显示 CPU 核心使用率

linux - Bash 脚本导出/来源奇怪的行为

linux - SD 卡 : how to force the kernel to read the WP pin again without removing the sdcard

linux - Docker 实例无法再运行图像并且无法回收可用空间

java - 在 Linux 机器上每 5 分钟使用 java 程序间歇更新数据库

linux - 如何在 sunos 中获取附加到特定端口的进程 ID

bash - 仅在我之前的所有工作完成后才运行工作

ruby-on-rails - Rails和Net:SSH