1 #!/usr/bin/env bash
2
3 #### Append string to string
4 s='abc'
5 s+=d
6 echo $s
7 ## stdout: abcd
8
9 #### Append array to array
10 a=(x y )
11 a+=(t 'u v')
12 argv.py "${a[@]}"
13 ## stdout: ['x', 'y', 't', 'u v']
14
15 #### Append array to string should be an error
16 s='abc'
17 s+=(d e f)
18 echo $s
19 ## BUG bash/mksh stdout: abc
20 ## BUG bash/mksh status: 0
21 ## status: 1
22
23 #### Append string to array should be disallowed
24 # They treat this as implicit index 0. We disallow this on the LHS, so we will
25 # also disallow it on the RHS.
26 a=(x y )
27 a+=z
28 argv.py "${a[@]}"
29 ## OK bash/mksh stdout: ['xz', 'y']
30 ## OK bash/mksh status: 0
31 ## status: 1
32
33 #### Append string to array element
34 # They treat this as implicit index 0. We disallow this on the LHS, so we will
35 # also disallow it on the RHS.
36 a=(x y )
37 a[1]+=z
38 argv.py "${a[@]}"
39 ## stdout: ['x', 'yz']
40 ## status: 0
41
42 #### Append to last element
43 # Works in bash, but not mksh. It seems like bash is doing the right thing.
44 # a[-1] is allowed on the LHS. mksh doesn't have negative indexing?
45 a=(1 '2 3')
46 a[-1]+=' 4'
47 argv.py "${a[@]}"
48 ## stdout: ['1', '2 3 4']
49 ## BUG mksh stdout: ['1', '2 3', ' 4']
50
51 #### Try to append list to element
52 # bash - runtime error: cannot assign list to array number
53 # mksh - a[-1]+: is not an identifier
54 # osh - parse error -- could be better!
55 a=(1 '2 3')
56 a[-1]+=(4 5)
57 argv.py "${a[@]}"
58 ## OK bash STDOUT:
59 ['1', '2 3']
60 ## END
61 ## OK bash status: 0
62 ## N-I mksh stdout-json: ""
63 ## N-I mksh status: 1
64 ## OK stdout-json: ""
65 ## OK osh status: 2
66
67 #### Strings have value semantics, not reference semantics
68 s1='abc'
69 s2=$s1
70 s1+='d'
71 echo $s1 $s2
72 ## stdout: abcd abc
73
74 #### Append to nonexistent string
75 f() {
76 local a+=a
77 echo $a
78
79 b+=b
80 echo $b
81
82 readonly c+=c
83 echo $c
84
85 export d+=d
86 echo $d
87
88 # Not declared anywhere
89 e[1]+=e
90 echo ${e[1]}
91
92 # Declare is the same, but mksh doesn't support it
93 #declare e+=e
94 #echo $e
95 }
96 f
97 ## STDOUT:
98 a
99 b
100 c
101 d
102 e
103 ## END
104
105 # += is invalid on assignment builtins
106 ## OK osh stdout-json: ""
107 ## OK osh status: 1
108
109
110 #### Append to nonexistent array is allowed
111
112 ## TODO: strict-array could get rid of this?
113 y+=(c d)
114 argv.py "${y[@]}"
115 ## STDOUT:
116 ['c', 'd']
117 ## END
118
119 #### Append used like env prefix is a parse error
120 # This should be an error in other shells but it's not.
121 A=a
122 A+=a printenv.py A
123 ## status: 2
124 ## BUG bash stdout: aa
125 ## BUG bash status: 0
126 ## BUG mksh stdout: a
127 ## BUG mksh status: 0