| 1 | #!/bin/bash |
| 2 | |
| 3 | # NOTE: |
| 4 | # -declare -A is required. |
| 5 | # |
| 6 | # Simply doing: |
| 7 | # a=([aa]=b [foo]=bar ['a+1']=c) |
| 8 | # gets utterly bizarre behavior. |
| 9 | # |
| 10 | # Associtative Arrays are COMPLETELY bash-specific. mksh doesn't even come |
| 11 | # close. So I will probably not implement them, or implement something |
| 12 | # slightly different, because the semantics are just wierd. |
| 13 | |
| 14 | # http://www.gnu.org/software/bash/manual/html_node/Arrays.html |
| 15 | # TODO: Need a SETUP section. |
| 16 | |
| 17 | ### TODO: SETUP should be share |
| 18 | declare -A a |
| 19 | a=([aa]=b [foo]=bar ['a+1']=c) |
| 20 | |
| 21 | ### retrieve indices with ! |
| 22 | declare -A a |
| 23 | a=([aa]=b [foo]=bar ['a+1']=c) |
| 24 | argv.py "${!a[@]}" |
| 25 | # Is this invalid on associative arrays? Makes no sense. |
| 26 | # stdout: ['aa', 'foo', 'a+1'] |
| 27 | |
| 28 | ### $a gives nothing |
| 29 | declare -A a |
| 30 | a=([aa]=b [foo]=bar ['a+1']=c) |
| 31 | echo "${a}" |
| 32 | # stdout-json: "\n" |
| 33 | |
| 34 | ### length of dict does not work |
| 35 | declare -A a |
| 36 | a=([aa]=b [foo]=bar ['a+1']=c) |
| 37 | echo "${#a}" |
| 38 | # stdout: 0 |
| 39 | |
| 40 | ### index by number doesn't work |
| 41 | declare -A a |
| 42 | a=([aa]=b [foo]=bar ['a+1']=c) |
| 43 | echo 0 "${a[0]}" 1 "${a[1]}" 2 "${a[2]}" |
| 44 | # stdout-json: "0 1 2 \n" |
| 45 | |
| 46 | ### index by key name |
| 47 | declare -A a |
| 48 | a=([aa]=b [foo]=bar ['a+1']=c) |
| 49 | echo "${a[aa]}" "${a[foo]}" "${a['a+1']}" |
| 50 | # WTF: Why do we get bar bar c? |
| 51 | # stdout-json: "b bar c\n" |
| 52 | |
| 53 | ### index by quoted string |
| 54 | declare -A a |
| 55 | a=([aa]=b [foo]=bar ['a+1']=c) |
| 56 | echo "${a['a+1']}" |
| 57 | # stdout: c |
| 58 | |
| 59 | ### index by unquoted string |
| 60 | declare -A a |
| 61 | a=([aa]=b [foo]=bar ['a+1']=c) |
| 62 | echo "${a[a+1]}" |
| 63 | # stdout: c |
| 64 | |
| 65 | ### index by unquoted string as arithmetic |
| 66 | # For assoc arrays, unquoted string is just raw. |
| 67 | # For regular arrays, unquoted string is an arithmetic expression! |
| 68 | # How do I parse this? |
| 69 | declare -A assoc |
| 70 | assoc=([a+1]=c) |
| 71 | array=(5 6 7) |
| 72 | a=1 |
| 73 | echo "${assoc[a]}" |
| 74 | echo "${assoc[a+1]}" # This works |
| 75 | echo "${array[a+1]}" |
| 76 | # stdout-json: "\nc\n7\n" |
| 77 | |
| 78 | ### WTF index by key name |
| 79 | declare -A a |
| 80 | a=([xx]=bb [cc]=dd) |
| 81 | echo "${a[xx]}" "${a[cc]}" |
| 82 | # stdout-json: "bb dd\n" |
| 83 | |
| 84 | ### Array stored in associative array gets converted to string |
| 85 | array=('1 2' 3) |
| 86 | declare -A d |
| 87 | d[a]="${array[@]}" |
| 88 | argv.py "${d[a]}" |
| 89 | # stdout: ['1 2 3'] |
| 90 | |
| 91 | ### Can't initialize assoc array with indexed array |
| 92 | declare -A A=(1 2 3) |
| 93 | # status: 1 |
| 94 | # BUG bash status: 0 |
| 95 | |
| 96 | ### Initializing indexed array with with assoc array drops the constants |
| 97 | declare -a a=([xx]=1 [yy]=2 [zz]=3) |
| 98 | #declare -a a=(1 2 3) |
| 99 | echo "${a[@]}" |
| 100 | #echo "${!a[@]}" |
| 101 | # N-I mksh stdout-json: "" |
| 102 | # BUG bash stdout-json: "3\n" |