OILS / doc / old / legacy-array.md View on Github | oilshell.org

156 lines, 90 significant
1---
2in_progress: yes
3css_files: ../../web/base.css ../../web/manual.css ../../web/toc.css
4---
5
6Draft
7=====
8
9## Operations on Arrays
10
11### Initialization
12
13 declare -a array
14 declare -a array=()
15
16 declare -A assoc
17 # there is no empty literal here
18
19Also valid, but not necessary since `declare` is local:
20
21 local -a array
22 local -A assoc
23
24Makes a global array:
25
26 array=()
27
28### Array Literals
29
30Respects the normal rules of argv.
31
32 prefix=foo
33 myarray=(one two -{three,four}- {5..8} *.py "$prefix*.py" '$prefix*.py')
34
35 myarray=(
36 $var ${var} "$var"
37 $(echo hi) "$(echo hi)"
38 $(1 + 2 * 3)
39 )
40
41### Associative Array Literals
42
43 (['k']=v)
44
45 Unlike bash, ([0]=v) is still an associative array literal.
46
47 It's not an indexed array literal. This matters when you take slices and
48 so forth?
49
50
51### "${a[@]}" is Evaluating (Splicing)
52
53 echo "${array[@]}"
54 echo "${assoc[@]}"
55
56Not Allowed, unlike in bash!
57
58 $assoc ${assoc} "${assoc}"
59 ${!assoc} ${assoc//pattern/replace} # etc.
60
61
62### Iteration
63
64Note that since a for loop takes an array of words, evaluating/splicing works:
65
66 for i in "${a1[@]}" "${a2[@]}"; do
67 echo $i
68 done
69
70### ${#a[@]} is the Length
71
72
73 echo ${#array[@]}
74 echo ${#assoc[@]}
75
76
77### Coercion to String by Joining Elements
78
79 echo ${!array[@]}
80 echo ${!assoc[@]}
81
82 echo ${!array[*]}
83 echo ${!assoc[*]}
84
85 echo "${!array[*]}"
86 echo "${!assoc[*]}"
87
88### Look Up By Index / Key With a[]
89
90 matrix:
91 a['x'] a["x"]
92 a["$x"]
93 a[$x]
94 a[${x}]
95 a[${x#a}]
96
97 a[x] -- allowed
98 A[x] -- NOT allowed? It should be a string
99
100 (( 'a' )) -- parsed, but can't evaluate
101
102 # This is a string in both cases
103 a[0]
104 A[0]
105
106
107undef[0]=1 automatically creates an INDEXED array
108undef=(1)
109
110### Assign / Append To Location Specified by Index / Key
111
112 a[expr]= # int_coerce
113 A[expr]= # no integer coercion
114
115Just like you can append to strings:
116
117 s+='foo'
118
119Append to elements of an array, which are strings:
120
121 a[x+1]+=x
122 a[x+1]+=$x
123
124### Slicing With ${a[@]:5:2}
125
126 ${array[@]:1:3}
127
128Note the presence of DISALLOWED VALUES.
129
130
131 # TODO: disallow this? because no order
132 ${assoc[@]:1:3}
133
134
135NOTE: string slicing:
136
137
138
139### Append Array to Array
140
141 a=(1 2 3)
142 a+=(4 5 6)
143
144
145### Get All Indices With ${!a[@]}
146
147 echo ${!array[@]}
148 echo ${!assoc[@]}
149
150
151### Vectorized String Operations
152
153 echo ${array[@]//x/X}
154
155 echo ${assoc[@]//x/X}
156