【问题标题】:Saving in arrays and comparing an argument to an array in bash保存数组并将参数与bash中的数组进行比较
【发布时间】: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 语句不够准确,因为这是我第四次编辑它并且它有效,但过了一段时间它不再有效 需要帮助

【问题讨论】:

  • 您的管道会创建一个子外壳。因此,您对varAvarB 的分配发生在子shell 中,并且一旦子shell 退出就会丢失。请参阅 mywiki.wooledge.org/BashFAQ/001 了解如何在没有子 shell 的情况下执行此操作。
  • 您的[[ 比较也很奇怪,可能不是您真正想要的。右侧的~ 可能是字面意思(您的意思是=~ 用于正则表达式比较)?此外,您正在匹配 varA unquoted 的全部内容,这意味着您可能会匹配 between 条目(即一个条目的结尾和另一个条目的开头)。如果要搜索数组中的条目,则需要单独循环和比较或使用关联数组(bash 4+)。或者根本不读取文件并使用grep 或类似方法来检查匹配项。
  • @EtanReisner 感谢您的指导,但如果您能告诉我链接上的哪些段落解释了子外壳以及如何恢复它们,因为我找不到它
  • 看看那里的解决方案。看看他们如何不使用管道?这就是解决方案:不要使用管道。使用其他输入重定向选项之一。
  • 谢谢你,非常感谢你的建议,现在它正在工作,决定将数组保存到一个文本文件中,然后我就像你说的那样使用 grep 来查找评论

标签: arrays bash shell if-statement


【解决方案1】:

您的管道会创建一个子外壳。因此,您对varAvarB 的分配发生在子shell 中,并且一旦子shell 退出就会丢失。请参阅 How can I read a file (data stream, variable) line-by-line (and/or field-by-field)? 了解如何在没有子 shell 的情况下执行此操作。 – 伊坦·赖斯纳
看看那里的解决方案。看看他们如何不使用管道?这就是解决方案:不要使用管道。使用其他输入重定向选项之一。 ——伊坦·赖斯纳

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-22
    • 2015-10-23
    • 1970-01-01
    • 2020-08-06
    • 2016-05-24
    • 1970-01-01
    • 2014-05-17
    • 1970-01-01
    相关资源
    最近更新 更多