【发布时间】:2017-04-05 19:21:44
【问题描述】:
我设计了一个简单的测试来查看 Bash 在递归中的表现,但我不明白结果。
测试:
- 在shell中分配一个全局变量
X - 创建一个函数
f(),分配一个同名的变量local X - 分配
local X全局X的值,即local X=$X - 将此函数递归几次,并检查在每次递归时,它是否使用上一轮函数中的全局
X或local X
我预期以下两种结果之一:
- 在每次递归时,前一个
f()中的local X将是新的“全局”X,即下一个作用域中的X,这表明每次递归都会创建一个新作用域在上一个范围之下 - 在每次递归时,之前的
local X值将被遗忘,每个新的local X=$X将简单地重新分配我最初分配的全局X的值。这表明 Bash 创建了相邻的作用域。
我没有得到任何这些。我得到了一些奇怪的东西。以下是终端的复制粘贴。
我在shell中分配了一个全局变量:
user@ubuntu-zesty:~$ X=1
我在创建local X的shell中创建了一个函数f(),将全局X的值分配给它,进入一个while循环,将1加到local X(我假设它是本地的) ,打印新的local X 值,并调用自身。重复 5 或 6 次。
user@ubuntu-zesty:~$ f() { local X=$X; while [ $X -lt 6 ]; do X=$(( $X + 1 )); echo $X; sleep 1; f; done; }
然后我调用f(),输出就莫名其妙了。
user@ubuntu-zesty:~$ f
2
3
4
5
6
6
5
6
6
4
5
6
6
5
6
6
3
4
5
6
6
5
6
6
4
5
6
6
5
6
6
此时它自行退出。正如预期的那样,全球X 不受影响。
user@ubuntu-zesty:~$ echo $X
1
那么这里发生了什么?有时使用全局X,有时使用local X?如果你知道这里发生了什么,请不要把血淋淋的细节留给我。
最后,只是为了好玩,输出的图表:
1 ==
2 ===
3 ====
4 =====
5 ======
6 ======
7 =====
8 ======
9 ======
10 ====
11 =====
12 ======
13 ======
14 =====
15 ======
16 ======
17 ===
18 ====
19 =====
20 ======
21 ======
22 =====
23 ======
24 ======
25 ====
26 =====
27 ======
28 ======
29 =====
30 ======
31 ======
规格:
- Bash-4.4.5(1)-release
- x86_64 Ubuntu Zesty
- Linux 内核 4.10.0-17-generic
- VMware Workstation 12 虚拟机
【问题讨论】:
标签: linux bash shell ubuntu recursion