除非在shell脚本中没有?

时间:2014-02-19 17:50:44

标签: bash if-statement hash

我尝试在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

谁能告诉我如何让它发挥作用?

3 个答案:

答案 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"

&&:仅在第一次成功时继续执行下一个命令

||:如果第一次没有成功,只执行下一个命令