1 #!/usr/bin/env bash
2 #
3 # Var refs are done with ${!a} and local/declare -n.
4 #
5 # http://stackoverflow.com/questions/16461656/bash-how-to-pass-array-as-an-argument-to-a-function
6
7 ### var ref ${!a}
8 a=b
9 b=c
10 echo ref ${!a} ${a}
11 # Woah mksh has a completely different behavior -- var name, not var ref.
12 # stdout: ref c b
13 # BUG mksh stdout: ref a b
14 # N-I dash/zsh stdout-json: ""
15
16 ### var ref with special vars
17 myfunc() {
18 local ref=$1
19 echo ${!ref}
20 }
21 myfunc FUNCNAME
22 myfunc '?' # osh doesn't do this dynamically
23 # stdout-json: "myfunc\n0\n"
24 # N-I mksh stdout-json: "ref\nref\n"
25
26 ### declare -n and ${!a}
27 declare -n a
28 a=b
29 b=c
30 echo ${!a} ${a}
31 # stdout: b c
32 # N-I mksh stdout: a b
33
34 ### Bad var ref with ${!a}
35 #set -o nounset
36 a='bad var name'
37 echo ref ${!a}
38 echo status=$?
39 # stdout-json: "ref\nstatus=0\n"
40 # BUG mksh stdout-json: "ref a\nstatus=0\n"
41 ### pass array by reference
42 show_value() {
43 local -n array=$1
44 local idx=$2
45 echo "${array[$idx]}"
46 }
47 shadock=(ga bu zo meu)
48 show_value shadock 2
49 # stdout: zo
50
51 ### pass assoc array by reference
52 show_value() {
53 local -n array=$1
54 local idx=$2
55 echo "${array[$idx]}"
56 }
57 days=([monday]=eggs [tuesday]=bread [sunday]=jam)
58 show_value days sunday
59 # stdout: jam
60 # BUG mksh stdout: [monday]=eggs
61 # mksh note: it coerces "days" to 0? Horrible.
62
63 ### pass local array by reference, relying on DYNAMIC SCOPING
64 show_value() {
65 local -n array=$1
66 local idx=$2
67 echo "${array[$idx]}"
68 }
69 caller() {
70 local shadock=(ga bu zo meu)
71 show_value shadock 2
72 }
73 caller
74 # stdout: zo
75 # mksh appears not to hav elocal arrays!
76 # BUG mksh stdout-json: ""
77 # BUG mksh status: 1
78
79