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
|