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 |
|