Bash - 指向关联数组中值的指针?
Bash - Pointer to Value in Associate Array?
在 Bash
中有没有办法使 指针 指向 [=35] 中键的 值 =]关联数组?像这样:
declare -A mapp
mapp=( ["key"]="${value}" )
for k in "${!mapp[@]}"; do
pointer="${mapp["${k}"]}" # How do I do this?
done
通常,您不需要使用指针,但我很想知道是否有办法制作指针。
在更简单的情况下(即,对于 normal/string 变量),我会像这样创建一个指针:
pointer=b
read -p "Enter something: " b
eval pointer=$${pointer}
如何为关联数组执行此操作?这不起作用(跳过带删除线的代码):
declare -A mapp
mapp=( ["first"]="${a}" ["second"]="${b}" )
for k in "${!mapp[@]}"; do
v=mapp["${k}"]
read -p "Enter ${k}: " new
eval v=$${v} # Doesn't work
done
declare -A mapp
mapp=( ["first"]="${a}" ["second"]="${b}" )
for k in "${!mapp[@]}"; do
v=mapp["${k}"]
read -p "Enter ${k}: " k
eval v=$${v} # Doesn't work
done
这也不起作用(跳过带删除线的代码):
declare -A mapp
mapp=( ["first"]="${a}" ["second"]="${b}" )
for k in "${!mapp[@]}"; do
v=mapp
read -p "Enter ${k}: " new
eval v=$${v["${k}"]} # Doesn't work (and has terrible readability)
done
declare -A mapp
mapp=( ["first"]="${a}" ["second"]="${b}" )
for k in "${!mapp[@]}"; do
v=mapp
read -p "Enter ${k}: " k
eval v=$${v["${k}"]} # Doesn't work (and has terrible readability)
done
没问题:
$ declare -A ary=([foo]=bar [baz]=qux)
$ key=foo
$ pointer="ary[$key]"
$ echo "$pointer"
ary[foo]
$ echo "${!pointer}"
bar
A "pointer" 在这个意义上是 indirect variable
在 bash
4.3 中,您可以使用 nameref:
$ mapp=([key]=value)
$ declare -n x=mapp[key] # NO dollar sign!
$ x=7
$ echo ${mapp[key]}
7
在 4.3 之前,您需要使用不同的 declare
命令来进行间接寻址。
$ mapp=([key]=value)
$ x=mapp[key] # NO dollar sign!
$ declare "$x=7"
$ echo ${mapp[key]}
7
在 Bash
中有没有办法使 指针 指向 [=35] 中键的 值 =]关联数组?像这样:
declare -A mapp
mapp=( ["key"]="${value}" )
for k in "${!mapp[@]}"; do
pointer="${mapp["${k}"]}" # How do I do this?
done
通常,您不需要使用指针,但我很想知道是否有办法制作指针。
在更简单的情况下(即,对于 normal/string 变量),我会像这样创建一个指针:
pointer=b
read -p "Enter something: " b
eval pointer=$${pointer}
如何为关联数组执行此操作?这不起作用(跳过带删除线的代码):
declare -A mapp
mapp=( ["first"]="${a}" ["second"]="${b}" )
for k in "${!mapp[@]}"; do
v=mapp["${k}"]
read -p "Enter ${k}: " new
eval v=$${v} # Doesn't work
done
declare -A mapp
mapp=( ["first"]="${a}" ["second"]="${b}" )
for k in "${!mapp[@]}"; do
v=mapp["${k}"]
read -p "Enter ${k}: " k
eval v=$${v} # Doesn't work
done
这也不起作用(跳过带删除线的代码):
declare -A mapp
mapp=( ["first"]="${a}" ["second"]="${b}" )
for k in "${!mapp[@]}"; do
v=mapp
read -p "Enter ${k}: " new
eval v=$${v["${k}"]} # Doesn't work (and has terrible readability)
done
declare -A mapp
mapp=( ["first"]="${a}" ["second"]="${b}" )
for k in "${!mapp[@]}"; do
v=mapp
read -p "Enter ${k}: " k
eval v=$${v["${k}"]} # Doesn't work (and has terrible readability)
done
没问题:
$ declare -A ary=([foo]=bar [baz]=qux)
$ key=foo
$ pointer="ary[$key]"
$ echo "$pointer"
ary[foo]
$ echo "${!pointer}"
bar
A "pointer" 在这个意义上是 indirect variable
在 bash
4.3 中,您可以使用 nameref:
$ mapp=([key]=value)
$ declare -n x=mapp[key] # NO dollar sign!
$ x=7
$ echo ${mapp[key]}
7
在 4.3 之前,您需要使用不同的 declare
命令来进行间接寻址。
$ mapp=([key]=value)
$ x=mapp[key] # NO dollar sign!
$ declare "$x=7"
$ echo ${mapp[key]}
7