我設計了一個簡單的測試,看看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