首页 > 解决方案 > 如果数组不包含if语句中的值,bash如何插入数组

问题描述

我有一个函数来检查数组中是否有东西:

function inArray() {
    local val="$1"
    shift
    local array=("$@")
    for i in "${array[@]}"; do
        if [ "${i}" == "${val}" ]; then
            return 0
        fi
    done
    return 1
}

noDupe还有一个 if 语句,仅当它还没有该值时才尝试将值插入:

noDupe=()
values=("test" "test" "test2")
for value in ${values[@]}; do
    if [ $(inArray "${value}" "${values[@]}") -eq 1 ]; then
        noDupe+="{value}"
    fi
done

我当前的错误是-eq需要一元运算符。我尝试将其更改为 a==但这仅适用于字符串,而不是我的函数返回的0s 和s。1如何使 if 语句起作用?

标签: bash

解决方案


您的函数正在使用返回值,但是如果打印了返回值,您将尝试使用它。“如果退出状态非零”的正确用法简化为

if ! inArray "${value}" "${values[@]}"; then

旁注:您得到的错误不是-eq需要一元运算符,而是

bash: [: -eq: unary operator expected

这意味着[需要一个一元运算符,但它却得到了-eq一个二元运算符。这是因为您的命令替换没有被引用,并且当命令没有返回任何内容时,您的测试变为

[ -eq 1 ]

通过适当的引用,

[ "$(inArray "${value}" "${values[@]}")" -eq 1 ]

测试会抱怨它需要一个整数表达式(但得到的是空字符串),因为它扩展为

[ "" -eq 1 ]

推荐阅读