我试图在 shell 中做与 if 相反的事情,只在哈希中的值不存在时才做某事。我从这里学会了在 bash 中创建哈希:Shell 脚本中的关联数组
declare -A myhash
我声明了一个简单的哈希:
myhash[$key]="1"
和
[ ${myhash[$key]+abc} ]
从这里查看myhash[$key]是否存在: 检查数组中的索引或键的最简单方法?
我还学会了在表达式前面添加 ! 在 if 子句中做相反的事情:如何使"如果不是真实的条件"?
但以下表达
if ! [ ${myhash[$key]+abc} ]; then
echo $key
fi
不起作用,并且不打印任何信息。没有错误消息。
我试过这个:
[ ${myhash[$key]+abc} ] && echo $key
并收到错误消息:
abc: command not found
谁能告诉我如何让它工作?
首先,这个
[ ${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
检查数组中的索引或键的最简单方法? 显示了如何使用 [ ${array[key]+abc} ]
检查它是否存在。
如果是这样,命令将成功退出,因此&&
之后的部分被执行(echo "exists"
您要检查它是否不存在。因此,您希望在[..]
部分退出不成功时执行命令。所以使用 ||
而不是 &&
:
[ ${myhash[$key]+abc} ] || echo "does not exist"
&&
:仅当第一个成功时,才继续执行下一个命令
||
:仅在第一个命令不成功的情况下继续执行下一个命令
不打印任何内容的原因是您在设置后检查值是否未设置。
以下是您正在执行的操作:
#!/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
。你确定你正确地展示了你运行的实际示例,以及你得到的实际结果