bash - 在 shell 脚本中没有 unless 吗?

标签 bash if-statement hash

我尝试在 shell 中执行与 if 相反的操作,仅在散列中的值不存在时才执行某些操作。我从这里学会了在 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

谁能告诉我如何让它工作?

最佳答案

首先是这个

[ ${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

关于bash - 在 shell 脚本中没有 unless 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21888393/

相关文章:

linux - 将数字添加到 bash 中某些行的开头

JavaScript - 如果条件为真,则阻止将某些元素插入数组

mysql - 消除 MySQL 表上迟来的数据操作的可能性

string - 是否有一种散列技术可以为字符串的反转返回与原始字符串相同的散列?

algorithm - 需要一个函数从较大的哈希创建较小的哈希

r - 是否可以停下来返回

bash - Shell 脚本 - 在文件中智能替换并在第二个文件中查找

bash - 使用多个排序键对文件列表进行排序

java - 我的代码抛出 ArrayIndexOutOfBoundsException

用于分辨率检测的 JavaScript,但似乎返回错误