Bash 스크립트 모드를 찾을 수 없습니다

Bash 스크립트 모드를 찾을 수 없습니다

다음 스크립트가 있습니다.

#!/bin/bash
result=$(grep "pattern 1\|pattern 2\|pattern 3\|pattern 4\|pattern 5\|pattern 6\|pattern 7\|pattern 8" file_data.dat)

if [ -n "$result" ]; then
    printf '%s\n' "$result"
else
    printf 'No match found for pattern "%s"\n' "$pattern"
fi

작동하지만 문제가 있습니다. 패턴 중 하나가 일치하지 않으면 알고 싶습니다.어느패턴 불일치.

나는 또한 다음을 시도했습니다.

#!/bin/bash

if
        grep "pattern 1\|pattern 2\|pattern 3\|pattern 4\|pattern 5\|pattern 6\|pattern 7\|pattern 8" file_data.dat
then
echo "All patterns found"
else
echo "Missing pattern"
fi

하지만 같은 문제가 있습니다.

답변1

생각해 보세요:

#!/bin/bash -
patterns=('pattern1' 'pattern2' 'pattern3' 'pattern4' '...')

for pat in "${patterns[@]}"; do
    if ! grep -q -e "$pat" infile; then
        ((missed++))
        printf '%s\n' "pattern $pat not found"
    fi
done
if [[ -z "$missed" ]]; then
    printf '%s\n' 'all patterns were found'
else
    printf 'Among %d patterns, %d patterns were not found\n' "${#patterns[@]}" "$missed"
fi                       

모든 패턴을 의 배열에 저장 patterns=( ... )한 다음 배열의 패턴을 반복하고 grep을 사용하여 일치하는지 확인합니다. 패턴이 일치하면 자동으로 종료하고, 그렇지 않으면 패턴을 찾을 수 없다고 보고하고 증가합니다.missed임시 변수를 1씩 감소시킵니다.

루프 외부에서 임시 변수가 설정되지 않았는지 확인합니다. 즉, 모든 패턴이 발견되어 보고되었음을 의미합니다. 그렇지 않으면 전체 패턴에서 누락된 패턴 수를 인쇄합니다.

관련 정보