For循环只打印一次echo命令

For循环只打印一次echo命令

在我创建的这个小 for 循环中,我需要循环为所有参数仅打印一次此消息。

for arg in $@
do
        echo "There are $(grep "$arg" cis132Students|wc -l) classmates in this list, where $(wc -l cis132Students) is the actual number of classmates."
done

$arg 中包含的是文件中确实存在的几个名称,以及文件中不存在的几个名称。发生的情况是,循环为每个参数多次打印该消息,而我只希望它打印一次。

答案1

您不想循环遍历参数,这是一次读取一个参数,导致您的 echo 语句为每个参数执行一次。

您可以执行以下操作:

#!/bin/sh

student_file=cis132Students
p=$(echo "$@" | tr ' ' '|')
ln=$(wc -l "$student_file")
gn=$(grep -cE "$p" "$student_file")

echo "There are $gn classmates in the list, where $ln is the actual number of classmates."

p:将转换为可以在扩展正则表达式模式下输入 grep 的字符串。例如,如果您提供参数:jesse jay它将被转换为jesse|jay
ln:将是输入文件中的总行数(学生)
gn:将是与您的参数搜索相匹配的学生数量

答案2

另一个解决方案:

$ cat cis132Students
peter
paul
mary
$ cat file
peter
mary
lucy
$ echo "There are $(grep -cf file cis132Students) classmates in this list, where $(wc -l <cis132Students) is the actual number of classmates."
There are 2 classmates in this list, where 3 is the actual number of classmates.
  • grep -cf file cis132Students:参数作为模式-f file输入file文件grep-c计算匹配行数
  • wc -l <cis132Students输出不带文件名的行数

相关内容