bash 4 中的键值字典错误地认为它有一个键
Key-value dictionary in bash 4 wrongly thinks it has a key
我想存储键值来存储人的地址。
以下代码构建一个 bash 4 数组,放入一个键值,然后尝试获取(不存在的)键的值:
#!/bin/bash
declare -A addresses
addresses["john doe"]="Cows street 67"
containsElement () {
local e
for e in "${@:2}"; do [[ "$e" == "" ]] && return 0; done
return 1
}
NAME="ian nothere"
containsElement "${NAME}" "${addresses[@]}"
if [[ $? -eq 1 ]]; then
echo "Address is known: "
echo ${addresses[${NAME}]}
else
echo "Address unknown"
fi
不幸的是,它 returns:
$ ./run.sh
Address is known:
$
我做错了什么?
这个 bash 文件中有几个问题,而且我承认我目前无法将字典作为参数传递。但在全球范围内这是错误的:
- 你循环遍历字典来查找值:不是字典的原理,而且确实不高效。将其设置为 200000 个条目,您会发现
O(n)
实现速度非常慢,但它不应该如此。
- 您真的不需要循环来查看是否存在,因为您最终会检索到该值!
备选方案:只检索值并检查是否为空
以名称作为参数的简化版本:
#!/bin/bash
declare -A addresses
addresses["john doe"]="Cows street 67"
addresses["freddy"]="Cat street 23"
NAME=
r=${addresses[${NAME}]}
if [ -z "$r" ] ; then
echo "Address unknown"
else
echo "Address is known: $r"
echo
fi
测试:
$ dict.sh "john doe"
Address is known: Cows street 67
$ dict.sh "john doeff"
Address unknown
我想存储键值来存储人的地址。
以下代码构建一个 bash 4 数组,放入一个键值,然后尝试获取(不存在的)键的值:
#!/bin/bash
declare -A addresses
addresses["john doe"]="Cows street 67"
containsElement () {
local e
for e in "${@:2}"; do [[ "$e" == "" ]] && return 0; done
return 1
}
NAME="ian nothere"
containsElement "${NAME}" "${addresses[@]}"
if [[ $? -eq 1 ]]; then
echo "Address is known: "
echo ${addresses[${NAME}]}
else
echo "Address unknown"
fi
不幸的是,它 returns:
$ ./run.sh
Address is known:
$
我做错了什么?
这个 bash 文件中有几个问题,而且我承认我目前无法将字典作为参数传递。但在全球范围内这是错误的:
- 你循环遍历字典来查找值:不是字典的原理,而且确实不高效。将其设置为 200000 个条目,您会发现
O(n)
实现速度非常慢,但它不应该如此。 - 您真的不需要循环来查看是否存在,因为您最终会检索到该值!
备选方案:只检索值并检查是否为空
以名称作为参数的简化版本:
#!/bin/bash
declare -A addresses
addresses["john doe"]="Cows street 67"
addresses["freddy"]="Cat street 23"
NAME=
r=${addresses[${NAME}]}
if [ -z "$r" ] ; then
echo "Address unknown"
else
echo "Address is known: $r"
echo
fi
测试:
$ dict.sh "john doe"
Address is known: Cows street 67
$ dict.sh "john doeff"
Address unknown