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파일 이름 없이 줄 수를 출력합니다.

관련 정보