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