【问题标题】:Bash: iterate in a list of variablesBash:迭代变量列表
【发布时间】:2018-11-07 23:55:29
【问题描述】:

我有一个群组列表,其中有人名:

group1="Kyliane Justine Noemie Marion"
group2="Julie Lilou"
group3="Lena Celeste"

等等……

我想检查一个组的人的名字在根据组号命名的文件中出现了多少次(例如:group1.txt)。

所以我有:

for person in $group1
do
number=$(grep -oi "$person" /path/group1.txt | wc -l)
echo $person "wrote" $number "times."
done

效果很好。

但是,我想要的是检查每个组文件中的每个组成员,不仅是 /path/group1.txt 中的 $group1,还有 /path/group2.txt 中的 $group2,等等。 . 我知道我可以复制粘贴我的代码,然后将 group1 更改为 group2、group3 等。但我确信有一种更快的方法,尤其是因为我有 12 个组!我是 bash 的初学者,我不知道该怎么做。

非常感谢您的帮助。

【问题讨论】:

  • for person in "$group1" "$group2" "$group3"?

标签: bash loops


【解决方案1】:

使用数组而不是单独的变量。

groups=("Kyliane Justine Noemie Marion" "Julie Lilou" "Lena Celeste")
i=1
for group in "${groups[@]}"
do 
    for person in $group
    do
        number=$(grep -oi "$person" /path/group$i.txt 2>/dev/null | wc -l)
        echo $person "wrote" $number "times."
    done
    i=$((i+1))
done

作为一般规则,每当您发现自己创建具有顺序名称的变量时,您可能应该使用数组或类似的数据结构。这适用于大多数编程语言。

【讨论】:

  • 可能是一个错字,可能你提到了"${groups[@]}"
  • 谢谢,但是有一个问题。我也需要这部分根据群号改:number=$(grep -oi "$person" /path/group1.txt | wc -l)
  • 我想通过这样做来修复它number=$(grep -oi "$person" path/group$i.txt.html | wc -l) 并在最后一个done 之前添加i=$((i+1))。但是如果例如 group4 不存在,那么我会收到一个错误...
  • 重定向stderr,你不会看到错误信息。
猜你喜欢
  • 1970-01-01
  • 2015-12-01
  • 1970-01-01
  • 2017-11-03
  • 1970-01-01
  • 2012-08-07
  • 1970-01-01
  • 2021-10-22
  • 1970-01-01
相关资源
最近更新 更多