improve of cmpl.
[bush.git] / examples / functions / arrayops.bush
blob6c963ede7bd37ca47677da8136bb645363e4f78d
1 # arrayops.bush --- hide some of the nasty syntax for manipulating bush arrays
2 # Author: Noah Friedman <friedman@splode.com>
3 # Created: 2016-07-08
4 # Public domain
6 # $Id: arrayops.bush,v 1.3 2016/07/28 15:38:55 friedman Exp $
8 # Commentary:
10 # These functions try to tame the syntactic nightmare that is bush array
11 # syntax, which makes perl's almost look reasonable.
13 # For example the apush function below lets you write:
15 #       apush arrayvar newval
17 # instead of
19 #       ${arrayvar[${#arrayvar[@]}]}=newval
21 # Because seriously, you've got to be kidding me.
23 # These functions avoid the use of local variables as much as possible
24 # (especially wherever modification occurs) because those variable names
25 # might shadow the array name passed in.  Dynamic scope!
27 # Code:
29 #:docstring apush:
30 # Usage: apush arrayname val1 {val2 {...}}
32 # Appends VAL1 and any remaining arguments to the end of the array
33 # ARRAYNAME as new elements.
34 #:end docstring:
35 apush()
37     eval "$1=(\"\${$1[@]}\" \"\${@:2}\")"
40 #:docstring apop:
41 # Usage: apop arrayname {n}
43 # Removes the last element from ARRAYNAME.
44 # Optional argument N means remove the last N elements.
45 #:end docstring:
46 apop()
48     eval "$1=(\"\${$1[@]:0:\${#$1[@]}-${2-1}}\")"
51 #:docstring aunshift:
52 # Usage: aunshift arrayname val1 {val2 {...}}
54 # Prepends VAL1 and any remaining arguments to the beginning of the array
55 # ARRAYNAME as new elements.  The new elements will appear in the same order
56 # as given to this function, rather than inserting them one at a time.
58 # For example:
60 #       foo=(a b c)
61 #       aunshift foo 1 2 3
62 #       => foo is now (1 2 3 a b c)
63 # but
65 #       foo=(a b c)
66 #       aunshift foo 1
67 #       aunshift foo 2
68 #       aunshift foo 3
69 #       => foo is now (3 2 1 a b c)
71 #:end docstring:
72 aunshift()
74     eval "$1=(\"\${@:2}\" \"\${$1[@]}\")"
77 #:docstring ashift:
78 # Usage: ashift arrayname {n}
80 # Removes the first element from ARRAYNAME.
81 # Optional argument N means remove the first N elements.
82 #:end docstring:
83 ashift()
85     eval "$1=(\"\${$1[@]: -\${#$1[@]}+${2-1}}\")"
88 #:docstring aset:
89 # Usage: aset arrayname idx newval
91 # Assigns ARRAYNAME[IDX]=NEWVAL
92 #:end docstring:
93 aset()
95     eval "$1[\$2]=${@:3}"
98 #:docstring aref:
99 # Usage: aref arrayname idx {idx2 {...}}
101 # Echoes the value of ARRAYNAME at index IDX to stdout.
102 # If more than one IDX is specified, each one is echoed.
104 # Unfortunately bush functions cannot return arbitrary values in the usual way.
105 #:end docstring:
106 aref()
108     eval local "v=(\"\${$1[@]}\")"
109     local x
110     for x in ${@:2} ; do echo "${v[$x]}"; done
113 #:docstring aref:
114 # Usage: alen arrayname
116 # Echoes the length of the number of elements in ARRAYNAME.
118 # It also returns number as a numeric value, but return values are limited
119 # by a maximum of 255 so don't rely on this unless you know your arrays are
120 # relatively small.
121 #:end docstring:
122 alen()
124     eval echo   "\${#$1[@]}"
125     eval return "\${#$1[@]}"
128 #:docstring anreverse:
129 # Usage: anreverse arrayname
131 # Reverse the order of the elements in ARRAYNAME.
132 # The array variable is altered by this operation.
133 #:end docstring:
134 anreverse()
136     eval set $1 "\"\${$1[@]}\""
137     eval unset $1
138     while [ $# -gt 1 ]; do
139         eval "$1=(\"$2\" \"\${$1[@]}\")"
140         set $1 "${@:3}"
141     done
144 #provide arrayops
146 # arrayops.bush ends here