我设计了一个简单的测试,看看Bash如何与递归行为,并且我不理解结果。Bash-4递归的奇怪结果
测试:
- 分配一个全局变量
X
在外壳 - 创建一个功能
f()
指派相同的名称 - 分配
local X
全球X
即local X=$X
的值的变量
- 重复执行此功能几次,并检查在每次递归时是否使用全局
X
或local X
从功能的前转
local X
我预期两种结局之一:
- 在每次迭代时,
local X
从以前f()
将成为新的“全球性”X
,即X
在下一个范围,这将指示每个递归创建一个新的范围在以前的范围下 - 在每次递归时,以前的
local X
值将被遗忘,并且每个新的local X=$X
只会重新分配我最初分配的全球X
。这表明Bash会创建相邻的作用域。
我没有得到任何这些。我有些奇怪。以下是来自终端的复制粘贴。
我分配全局变量在外壳:
[email protected]:~$ X=1
创建在创建local X
壳的函数f()
,分配全局X
到它的值,进入一个while循环中,加1 local X
(我假定它是本地的),打印新的local X
值,并自行调用。重复5或6次。
[email protected]:~$ f() { local X=$X; while [ $X -lt 6 ]; do X=$(($X + 1)); echo $X; sleep 1; f; done; }
然后我打电话f()
,输出只是莫名其妙。
[email protected]:~$ 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
未受影响。
[email protected]:~$ 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 ======
规格:
- 猛砸-4.4。5(1)-release
- x86_64的Ubuntu的兴致
- Linux内核4.10.0-17泛型
- VMware Workstation的12个虚拟机
很有意思,我需要后来和工作虽然这坐下。 – someguy54321