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 - cannot assign list to array number
53 # mksh - a[-1]+: is not an identifier
54 a=(1 '2 3')
55 a[-1]+=(4 5)
56 ## status: 1
57
58 #### Strings have value semantics, not reference semantics
59 s1='abc'
60 s2=$s1
61 s1+='d'
62 echo $s1 $s2
63 ## stdout: abcd abc
64
65 #### Append to nonexistent string
66 f() {
67 local a+=a
68 echo $a
69
70 b+=b
71 echo $b
72
73 readonly c+=c
74 echo $c
75
76 export d+=d
77 echo $d
78
79 # Not declared anywhere
80 e[1]+=e
81 echo ${e[1]}
82
83 # Declare is the same, but mksh doesn't support it
84 #declare e+=e
85 #echo $e
86 }
87 f
88 ## stdout-json: "a\nb\nc\nd\ne\n"
89
90 #### Append to nonexistent array
91 f() {
92 # NOTE: mksh doesn't like a=() after keyword. Doesn't allow local arrays!
93 local x+=(a b)
94 argv.py "${x[@]}"
95
96 y+=(c d)
97 argv.py "${y[@]}"
98
99 readonly z+=(e f)
100 argv.py "${z[@]}"
101 }
102 f
103 ## stdout-json: "['a', 'b']\n['c', 'd']\n['e', 'f']\n"
104 ## N-I mksh stdout-json: ""
105 ## N-I mksh status: 1
106
107 #### Append used like env prefix is a parse error
108 # This should be an error in other shells but it's not.
109 A=a
110 A+=a printenv.py A
111 ## status: 2
112 ## BUG bash stdout: aa
113 ## BUG bash status: 0
114 ## BUG mksh stdout: a
115 ## BUG mksh status: 0