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:
40 status=1
41 ## END
42 ## BUG mksh STDOUT:
43 ref a
44 status=0
45 ## END
46
47 #### pass array by reference
48 show_value() {
49 local -n array=$1
50 local idx=$2
51 echo "${array[$idx]}"
52 }
53 shadock=(ga bu zo meu)
54 show_value shadock 2
55 ## stdout: zo
56
57 #### pass assoc array by reference
58 show_value() {
59 local -n array=$1
60 local idx=$2
61 echo "${array[$idx]}"
62 }
63 days=([monday]=eggs [tuesday]=bread [sunday]=jam)
64 show_value days sunday
65 ## stdout: jam
66 ## BUG mksh stdout: [monday]=eggs
67 # mksh note: it coerces "days" to 0? Horrible.
68
69 #### pass local array by reference, relying on DYNAMIC SCOPING
70 show_value() {
71 local -n array=$1
72 local idx=$2
73 echo "${array[$idx]}"
74 }
75 caller() {
76 local shadock=(ga bu zo meu)
77 show_value shadock 2
78 }
79 caller
80 ## stdout: zo
81 # mksh appears not to hav elocal arrays!
82 ## BUG mksh stdout-json: ""
83 ## BUG mksh status: 1
84
85 #### ${!OPTIND} (used by bash completion
86 set -- a b c
87 echo ${!OPTIND}
88 f() {
89 local OPTIND=1
90 echo ${!OPTIND}
91 local OPTIND=2
92 echo ${!OPTIND}
93 }
94 f x y z
95 ## STDOUT:
96 a
97 x
98 y
99 ## END
100 ## N-I mksh STDOUT:
101 OPTIND
102 OPTIND
103 OPTIND
104 ## END