1 ## compare_shells: bash mksh
2 ## oils_failures_allowed: 2
3
4 # Arrays decay upon assignment (without splicing) and equality. This will not
5 # be true in Oil -- arrays will be first class.
6
7 #### Assignment Causes Array Decay
8 set -- x y z
9 argv.py "[$@]"
10 var="[$@]"
11 argv.py "$var"
12 ## STDOUT:
13 ['[x', 'y', 'z]']
14 ['[x y z]']
15 ## END
16
17 #### Array Decay with IFS
18 IFS=x
19 set -- x y z
20 var="[$@]"
21 argv.py "$var"
22 ## stdout: ['[x y z]']
23
24 #### User arrays decay
25 declare -a a b
26 a=(x y z)
27 b="${a[@]}" # this collapses to a string
28 c=("${a[@]}") # this preserves the array
29 c[1]=YYY # mutate a copy -- doesn't affect the original
30 argv.py "${a[@]}"
31 argv.py "${b}"
32 argv.py "${c[@]}"
33 ## STDOUT:
34 ['x', 'y', 'z']
35 ['x y z']
36 ['x', 'YYY', 'z']
37 ## END
38
39 #### strict_array: $array is not valid in OSH, is ${array[0]} in ksh/bash
40 shopt -s strict_array
41
42 a=(1 '2 3')
43 echo $a
44 ## STDOUT:
45 1
46 ## END
47 ## OK osh status: 1
48 ## OK osh stdout-json: ""
49
50 #### strict_array: ${array} is not valid in OSH, is ${array[0]} in ksh/bash
51 shopt -s strict_array
52
53 a=(1 '2 3')
54 echo ${a}
55 ## STDOUT:
56 1
57 ## END
58 ## OK osh status: 1
59 ## OK osh stdout-json: ""
60
61 #### Assign to array index without initialization
62 a[5]=5
63 a[6]=6
64 echo "${a[@]}" ${#a[@]}
65 ## stdout: 5 6 2
66
67 #### a[40] grows array
68 a=(1 2 3)
69 a[1]=5
70 a[40]=30 # out of order
71 a[10]=20
72 echo "${a[@]}" "${#a[@]}" # length is 1
73 ## stdout: 1 5 3 20 30 5
74
75 #### array decays to string when comparing with [[ a = b ]]
76 a=('1 2' '3 4')
77 s='1 2 3 4' # length 2, length 4
78 echo ${#a[@]} ${#s}
79 [[ "${a[@]}" = "$s" ]] && echo EQUAL
80 ## STDOUT:
81 2 7
82 EQUAL
83 ## END
84
85 #### ++ on a whole array increments the first element (disallowed with strict_array)
86 shopt -s strict_array
87
88 a=(1 10)
89 (( a++ )) # doesn't make sense
90 echo "${a[@]}"
91 ## stdout: 2 10
92 ## OK osh status: 1
93 ## OK osh stdout-json: ""
94
95 #### Apply vectorized operations on ${a[*]}
96 a=('-x-' 'y-y' '-z-')
97
98 # This does the prefix stripping FIRST, and then it joins.
99 argv.py "${a[*]#-}"
100 ## STDOUT:
101 ['x- y-y z-']
102 ## END
103 ## N-I mksh status: 1
104 ## N-I mksh stdout-json: ""
105
106 #### value.BashArray internal representation - Indexed
107
108 case $SH in mksh) exit ;; esac
109
110 z=()
111 declare -a | grep z=
112
113 z+=(b c)
114 declare -a | grep z=
115
116 # z[5]= finds the index, or puts it in SORTED order I think
117 z[5]=d
118 declare -a | grep z=
119
120 z[1]=ZZZ
121 declare -a | grep z=
122
123 # Adds after last index
124 z+=(f g)
125 declare -a | grep z=
126
127 # This is the equivalent of z[0]+=mystr
128 z+=-mystr
129 declare -a | grep z=
130
131 z[1]+=-append
132 declare -a | grep z=
133
134 argv.py keys "${!z[@]}" # 0 1 5 6 7
135 argv.py values "${z[@]}"
136
137 # can't do this conversion
138 declare -A z
139 declare -A | grep z=
140
141 echo status=$?
142
143 ## STDOUT:
144 declare -a z=()
145 declare -a z=([0]="b" [1]="c")
146 declare -a z=([0]="b" [1]="c" [5]="d")
147 declare -a z=([0]="b" [1]="ZZZ" [5]="d")
148 declare -a z=([0]="b" [1]="ZZZ" [5]="d" [6]="f" [7]="g")
149 declare -a z=([0]="b-mystr" [1]="ZZZ" [5]="d" [6]="f" [7]="g")
150 declare -a z=([0]="b-mystr" [1]="ZZZ-append" [5]="d" [6]="f" [7]="g")
151 ['keys', '0', '1', '5', '6', '7']
152 ['values', 'b-mystr', 'ZZZ-append', 'd', 'f', 'g']
153 status=1
154 ## END
155
156 ## N-I mksh STDOUT:
157 ## END
158
159 #### value.BashArray internal representation - Assoc (ordering is a problem)
160
161 case $SH in mksh) exit ;; esac
162
163 declare -A A=([k]=v)
164 declare -A | grep A=
165
166 argv.py keys "${!A[@]}"
167 argv.py values "${A[@]}"
168
169 exit
170
171 # Huh this actually works, we don't support it
172 # Hm the order here is all messed up, in bash 5.2
173 A+=([k2]=v2 [0]=foo [9]=9 [9999]=9999)
174 declare -A | grep A=
175
176 A+=-append
177 declare -A | grep A=
178
179 argv.py keys "${!A[@]}"
180 argv.py values "${A[@]}"
181
182 ## STDOUT:
183 declare -A A=([k]="v" )
184 ['keys', 'k']
185 ['values', 'v']
186 ## END
187
188 ## N-I mksh STDOUT:
189 ## END