1
2 #### Locals don't leak
3 f() {
4 local f_var=f_var
5 }
6 f
7 echo $f_var
8 ## stdout:
9
10 #### Globals leak
11 f() {
12 f_var=f_var
13 }
14 f
15 echo $f_var
16 ## stdout: f_var
17
18 #### Return statement
19 f() {
20 echo one
21 return 42
22 echo two
23 }
24 f
25 ## stdout: one
26 ## status: 42
27
28 #### Dynamic Scope
29 f() {
30 echo $g_var
31 }
32 g() {
33 local g_var=g_var
34 f
35 }
36 g
37 ## stdout: g_var
38
39 #### Dynamic Scope Mutation (wow this is bad)
40 f() {
41 g_var=f_mutation
42 }
43 g() {
44 local g_var=g_var
45 echo "g_var=$g_var"
46 f
47 echo "g_var=$g_var"
48 }
49 g
50 echo g_var=$g_var
51 ## STDOUT:
52 g_var=g_var
53 g_var=f_mutation
54 g_var=
55 ## END
56
57 #### Assign local separately
58 f() {
59 local f
60 f='new-value'
61 echo "[$f]"
62 }
63 f
64 ## stdout: [new-value]
65 ## status: 0
66
67 #### Assign a local and global on same line
68 myglobal=
69 f() {
70 local mylocal
71 mylocal=L myglobal=G
72 echo "[$mylocal $myglobal]"
73 }
74 f
75 echo "[$mylocal $myglobal]"
76 ## stdout-json: "[L G]\n[ G]\n"
77 ## status: 0
78
79 #### Return without args gives previous
80 f() {
81 ( exit 42 )
82 return
83 }
84 f
85 echo status=$?
86 ## STDOUT:
87 status=42
88 ## END