在我创建的这个小 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
输出不带文件名的行数