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 |