1 |
#!/usr/bin/env bash |
2 |
# |
3 |
# Arrays decay upon assignment (without splicing) and equality. This will not |
4 |
# be true in Oil -- arrays will be first class. |
5 |
|
6 |
#### Assignment Causes Array Decay |
7 |
set -- x y z |
8 |
argv.py "[$@]" |
9 |
var="[$@]" |
10 |
argv.py "$var" |
11 |
## STDOUT: |
12 |
['[x', 'y', 'z]'] |
13 |
['[x y z]'] |
14 |
## END |
15 |
|
16 |
#### Array Decay with IFS |
17 |
IFS=x |
18 |
set -- x y z |
19 |
var="[$@]" |
20 |
argv.py "$var" |
21 |
## stdout: ['[x y z]'] |
22 |
|
23 |
#### User arrays decay |
24 |
declare -a a b |
25 |
a=(x y z) |
26 |
b="${a[@]}" # this collapses to a string |
27 |
c=("${a[@]}") # this preserves the array |
28 |
c[1]=YYY # mutate a copy -- doesn't affect the original |
29 |
argv.py "${a[@]}" |
30 |
argv.py "${b}" |
31 |
argv.py "${c[@]}" |
32 |
## STDOUT: |
33 |
['x', 'y', 'z'] |
34 |
['x y z'] |
35 |
['x', 'YYY', 'z'] |
36 |
## END |
37 |
|
38 |
#### $array is not valid in OSH, is ${array[0]} in ksh/bash |
39 |
a=(1 '2 3') |
40 |
echo $a |
41 |
## STDOUT: |
42 |
1 |
43 |
## END |
44 |
## OK osh status: 1 |
45 |
## OK osh stdout-json: "" |
46 |
|
47 |
#### ${array} is not valid in OSH, is ${array[0]} in ksh/bash |
48 |
a=(1 '2 3') |
49 |
echo ${a} |
50 |
## STDOUT: |
51 |
1 |
52 |
## END |
53 |
## OK osh status: 1 |
54 |
## OK osh stdout-json: "" |
55 |
|
56 |
#### Assign to array index without initialization |
57 |
a[5]=5 |
58 |
a[6]=6 |
59 |
echo "${a[@]}" ${#a[@]} |
60 |
## stdout: 5 6 2 |
61 |
|
62 |
#### a[40] grows array |
63 |
a=(1 2 3) |
64 |
a[1]=5 |
65 |
a[40]=30 # out of order |
66 |
a[10]=20 |
67 |
echo "${a[@]}" "${#a[@]}" # length is 1 |
68 |
## stdout: 1 5 3 20 30 5 |
69 |
|
70 |
#### array decays to string when comparing with [[ a = b ]] |
71 |
a=('1 2' '3 4') |
72 |
s='1 2 3 4' # length 2, length 4 |
73 |
echo ${#a[@]} ${#s} |
74 |
[[ "${a[@]}" = "$s" ]] && echo EQUAL |
75 |
## STDOUT: |
76 |
2 7 |
77 |
EQUAL |
78 |
## END |
79 |
|
80 |
#### ++ on a whole array increments the first element (disallowed in OSH) |
81 |
a=(1 10) |
82 |
(( a++ )) # doesn't make sense |
83 |
echo "${a[@]}" |
84 |
## stdout: 2 10 |
85 |
## OK osh status: 1 |
86 |
## OK osh stdout-json: "" |
87 |
|
88 |
#### Apply vectorized operations on ${a[*]} |
89 |
a=('-x-' 'y-y' '-z-') |
90 |
|
91 |
# This does the prefix stripping FIRST, and then it joins. |
92 |
argv.py "${a[*]#-}" |
93 |
## STDOUT: |
94 |
['x- y-y z-'] |
95 |
## END |
96 |
## N-I mksh status: 1 |
97 |
## N-I mksh stdout-json: "" |