除非在外壳脚本中,否则没有



我试图在 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 $keyabc: command not found,我无法解释。这通常永远不会发生。

不过,如果你这样做,这就是你会看到的${myhash[$key]+abc} && echo $key。你确定你正确地展示了你运行的实际示例,以及你得到的实际结果

相关内容

  • 没有找到相关文章

最新更新