在Bash中如何在变量列表中循环迭代?

3

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

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,还有 $group2 在 /path/group2.txt 中,以此类推... 我知道可以复制粘贴代码并将 group1 更改为 group2、group3 等等。但我确信有一种更快的方法,特别是当我有 12 个组时!我是 bash 的初学者,不知道该怎么做。

非常感谢您的帮助。


对于每个人在"$group1" "$group2" "$group3"中。 - Cyrus
1个回答

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[@]}" - KamilCuk
谢谢,不过有一个问题。我还需要根据组号更改此部分:number=$(grep -oi "$person" /path/group1.txt | wc -l) - meaz
我考虑通过执行 number=$(grep -oi "$person" path/group$i.txt.html | wc -l) 并在最后一个 done 之前添加 i=$((i+1)) 来修复它。但是,如果例如 group4 不存在,则会出现错误... - meaz
重定向标准错误输出,就不会看到错误消息。 - Barmar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接