| 1 | ---
|
| 2 | in_progress: yes
|
| 3 | css_files: ../../web/base.css ../../web/manual.css ../../web/toc.css
|
| 4 | ---
|
| 5 |
|
| 6 | Draft
|
| 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 |
|
| 19 | Also valid, but not necessary since `declare` is local:
|
| 20 |
|
| 21 | local -a array
|
| 22 | local -A assoc
|
| 23 |
|
| 24 | Makes a global array:
|
| 25 |
|
| 26 | array=()
|
| 27 |
|
| 28 | ### Array Literals
|
| 29 |
|
| 30 | Respects 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 |
|
| 56 | Not Allowed, unlike in bash!
|
| 57 |
|
| 58 | $assoc ${assoc} "${assoc}"
|
| 59 | ${!assoc} ${assoc//pattern/replace} # etc.
|
| 60 |
|
| 61 |
|
| 62 | ### Iteration
|
| 63 |
|
| 64 | Note 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 |
|
| 107 | undef[0]=1 automatically creates an INDEXED array
|
| 108 | undef=(1)
|
| 109 |
|
| 110 | ### Assign / Append To Location Specified by Index / Key
|
| 111 |
|
| 112 | a[expr]= # int_coerce
|
| 113 | A[expr]= # no integer coercion
|
| 114 |
|
| 115 | Just like you can append to strings:
|
| 116 |
|
| 117 | s+='foo'
|
| 118 |
|
| 119 | Append 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 |
|
| 128 | Note the presence of DISALLOWED VALUES.
|
| 129 |
|
| 130 |
|
| 131 | # TODO: disallow this? because no order
|
| 132 | ${assoc[@]:1:3}
|
| 133 |
|
| 134 |
|
| 135 | NOTE: 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 |
|