我尝试在shell中执行相反的操作,只有在散列中的值不存在时才执行某些操作。我从这里学会了用bash创建一个哈希:Associative arrays in Shell scripts
declare -A myhash
我宣布了一个简单的哈希:
myhash[$key]="1"
和
[ ${myhash[$key]+abc} ]
从这里查看myhash [$ key]是否存在:Easiest way to check for an index or a key in an array?
我还学会了添加!在表达式前面,在if子句中执行相反的操作:How to make "if not true condition"?
但是以下表达式
if ! [ ${myhash[$key]+abc} ]; then
echo $key
fi
不起作用且不打印任何信息。没有错误消息。
我试过了:
[ ${myhash[$key]+abc} ] && echo $key
收到错误消息:
abc: command not found
谁能告诉我如何让它发挥作用?
答案 0 :(得分:2)
首先,这个
[ ${myhash[$key]+abc} ]
将测试参数扩展的结果是否为空。 ${myhash[$key]}
存在并扩展为一个字符串(它本身可能为空,也可能不为空),或者它不会,它会扩展为字符串“abc”。假设您未设置myhash[$key]=""
,则扩展始终生成非空字符串,因此命令成功。结果是,
! [ ${myhash[$key]+abc} ]
永远都会失败。
假设“abc”不是myhash
中的有效条目,您需要实际检查参数是否扩展为实际值,或者“abc”是否为未设置的键:
if [[ ${myhash[$key]+abc} == abc ]]; then
echo "$key does not exist in myhash"
else
echo "myhash[$key]=${myhash[$key]}"
fi
答案 1 :(得分:1)
没有打印的原因是因为您在设置后检查该值是否未设置。
以下是您正在做的事情:
#!/bin/bash
key=foo
declare -A myhash # create associative array
myhash[$key]="1" # set the value
if ! [ ${myhash[$key]+abc} ]; then # check if value is not set
echo $key # if so, print key
fi
现在你问“为什么在设置值时未设置检查触发?”
如果您想要检查密钥是否已设置,则不应使用!
反转存在性检查。
至于[ ${myhash[$key]+abc} ] && echo $key
给予abc: command not found
,我无法解释。它通常不会发生。
如果你做${myhash[$key]+abc} && echo $key
,那就是你会看到的。你确定你正确地展示了你运行的实际例子,以及你得到的实际结果
答案 2 :(得分:0)
Easiest way to check for an index or a key in an array?显示如何检查[ ${array[key]+abc} ]
是否存在。
如果是,则命令退出成功,因此&&
执行后的部分(echo "exists"
)
您想检查它是否不存在。因此,如果[..]
部分退出失败,您希望执行命令。因此,请使用||
代替&&
:
[ ${myhash[$key]+abc} ] || echo "does not exist"
&&
:仅在第一次成功时继续执行下一个命令
||
:如果第一次没有成功,只执行下一个命令