【发布时间】:2015-06-17 14:59:39
【问题描述】:
我不知道为什么这段代码停止工作 我测试了几次,它运行得很好 我想要听到的是在 2 个不同的阵列中排名第一和第二 然后将参数 $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 退出就会丢失。请参阅 mywiki.wooledge.org/BashFAQ/001 了解如何在没有子 shell 的情况下执行此操作。 -
您的
[[比较也很奇怪,可能不是您真正想要的。右侧的~可能是字面意思(您的意思是=~用于正则表达式比较)?此外,您正在匹配varAunquoted 的全部内容,这意味着您可能会匹配 between 条目(即一个条目的结尾和另一个条目的开头)。如果要搜索数组中的条目,则需要单独循环和比较或使用关联数组(bash 4+)。或者根本不读取文件并使用grep或类似方法来检查匹配项。 -
@EtanReisner 感谢您的指导,但如果您能告诉我链接上的哪些段落解释了子外壳以及如何恢复它们,因为我找不到它
-
看看那里的解决方案。看看他们如何不使用管道?这就是解决方案:不要使用管道。使用其他输入重定向选项之一。
-
谢谢你,非常感谢你的建议,现在它正在工作,决定将数组保存到一个文本文件中,然后我就像你说的那样使用 grep 来查找评论
标签: arrays bash shell if-statement