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 |
### $a gives first element of array |
39 |
a=(1 '2 3') |
40 |
echo $a |
41 |
# stdout: 1 |
42 |
|
43 |
### Assign to array index without initialization |
44 |
a[5]=5 |
45 |
a[6]=6 |
46 |
echo "${a[@]}" ${#a[@]} |
47 |
# stdout: 5 6 2 |
48 |
|
49 |
### a[40] grows array |
50 |
a=(1 2 3) |
51 |
a[1]=5 |
52 |
a[40]=30 # out of order |
53 |
a[10]=20 |
54 |
echo "${a[@]}" "${#a[@]}" # length is 1 |
55 |
# stdout: 1 5 3 20 30 5 |
56 |
|
57 |
### array decays to string when comparing with [[ a = b ]] |
58 |
a=('1 2' '3 4') |
59 |
s='1 2 3 4' # length 2, length 4 |
60 |
echo ${#a[@]} ${#s} |
61 |
[[ "${a[@]}" = "$s" ]] && echo EQUAL |
62 |
## STDOUT: |
63 |
2 7 |
64 |
EQUAL |
65 |
## END |
66 |
|
67 |
### Increment array variables |
68 |
a=(1 2) |
69 |
(( a++ )) # doesn't make sense |
70 |
echo "${a[@]}" |
71 |
# stdout: 2 2 |
72 |
|
73 |
### Apply vectorized operations on ${a[*]} |
74 |
a=('-x-' 'y-y' '-z-') |
75 |
|
76 |
# This does the prefix stripping FIRST, and then it joins. |
77 |
argv.py "${a[*]#-}" |
78 |
## STDOUT: |
79 |
['x- y-y z-'] |
80 |
## END |
81 |
## N-I mksh status: 1 |
82 |
## N-I mksh stdout-json: "" |