Arrays 保存在数组中并将参数与bash中的数组进行比较

Arrays 保存在数组中并将参数与bash中的数组进行比较,arrays,bash,shell,if-statement,Arrays,Bash,Shell,If Statement,我不知道为什么这个代码停止工作 我测试了它几次,它运行得很好 我想听到的是在两个不同的数组中分别放在第一和第二位 然后将参数$2==>$comment与数组varA进行比较,如果它在数组中,我不想将其存储在文本文件$file中 comment=$2 dueD=$3 x=0 hasData() { declare -a varA varB cat $file | while IFS=$'\t' read -r num first second;do varA+=

我不知道为什么这个代码停止工作 我测试了它几次,它运行得很好 我想听到的是在两个不同的数组中分别放在第一和第二位 然后将参数$2==>$comment与数组varA进行比较,如果它在数组中,我不想将其存储在文本文件$file中

comment=$2
dueD=$3
x=0

hasData()
{
    declare -a varA varB
    cat $file | while IFS=$'\t' read -r num first second;do
         varA+=("$first")
         varB+=("$second")
        done

    if [[ ${varA[@]} == ~$comment ]]; then
        echo "already in the Todo list"
    else
        x=$(cat $file | wc -l)
        x=$(($x+1))
        echo -e "$x\t$comment\t$dueD" >> $file
    fi
我认为我在数组中存储的值是错误的,因为当我尝试

echo ${varA[@]} 
什么都不会被打印出来 此外,我认为我的if语句不够准确,因为这是我第四次编辑它,它可以工作,但过了一段时间它就不再工作了
需要帮助吗?

您的管道将创建一个子外壳。因此,您对
varA
varB
的赋值发生在子shell中,并且在子shell退出时立即丢失。有关如何在没有子壳的情况下执行此操作的信息,请参见伊坦·赖斯纳

看看那里的解决方案。看看他们怎么不用管子?这就是解决办法:不要使用管道。使用其他输入重定向选项之一Etan Reisner

您的管道将创建一个子shell。因此,您对
varA
varB
的赋值发生在子shell中,并且在子shell退出时立即丢失。请参阅,了解如何在没有子shell的情况下执行此操作。另外,您的
[[
比较很奇怪,可能不是您真正想要的。右侧的
~
可能是文字(您的意思是
=
用于正则表达式比较)?还与
varA
unquote的全部内容相匹配,这意味着您可能会在条目之间匹配(即一个条目的结尾和另一个条目的开始)。如果要搜索数组中的条目,则需要单独循环和比较或使用关联数组(bash 4+)。或者根本不要读入文件,使用
grep
或类似方法检查匹配情况。@EtanReisner感谢您提供的指导,但如果您能告诉我链接上的praragraph是如何解释子shell的,以及如何恢复子shell的,因为我找不到解决方案。看看他们如何不使用管道?这就是问题所在lution:不要使用管道。使用其他输入重定向选项之一。谢谢你,我真的很感谢你的建议,现在它工作了,决定将数组保存到文本文件中,然后我像你说的那样使用grep来查找注释