파일에서 배열의 문자열 검색

파일에서 배열의 문자열 검색

options다음과 같은 단순화된 코드를 사용하여 배열의 항목이 파일에 있는지 확인하려고 합니다 .$file

options=(
    A
    B
    C
)

for i in "${options[@]}"; do
    if grep -F $file "${i}" = false; then
        echo "${i}"
    fi
done

나는 이것이 A, B 또는 C(존재하지 않는 경우)를 출력할 것으로 예상했지만 $fileA, B 및 C를 출력합니다.

grep: A: No such file or directory
grep: =: No such file or directory
grep: false: No such file or directory

이를 통해 grep은 모든 인수를 확인하거나 확인할 파일로 해석하는 것으로 보이며 이는 if 문에 부울 값에 대한 올바른 구문이 없음을 의미합니다. 그래서 내 질문은 두 가지입니다.

  1. grep이나 다른 명령을 사용하여 배열의 요소가 에 있는지 확인하려면 어떻게 해야 합니까 $file?
  2. 이 명령이 부울 값을 if 문의 일부로 유지하는 대신 매개변수로 해석하지 못하도록 하려면 어떻게 해야 합니까?

답변1

  1. 를 포함한 모든 변수 확장을 인용합니다 $file.
  2. "부울"을 확인하면 안됩니다. 껍질에는 그런 것이 없습니다. 의미하는 바는 grep의 종료 코드를 확인하는 것입니다. 일치하는 줄이 없으면 1이고 줄이 일치하면 0입니다(에서 찾을 수 있음 man grep).
  3. grep 매개변수의 순서를 확인하세요. 먼저 모드, 그다음 파일 이름입니다.

options그러면 파일에 없는 배열의 모든 요소가 에코됩니다 .

options=(
    A
    B
    C
)

for i in "${options[@]}"; do
    if ! grep -qF "$i" "$file"; then
        echo "$i"
    fi
done

-q표준 출력으로 전송될 grep과 일치하는 행을 억제하는 플래그를 grep에 추가했습니다 .

답변2

Usage: grep [OPTION]... PATTERN [FILE]...                                                                                                                          
Search for PATTERN in each FILE.                                                                                                                                   
Example: grep -i 'hello world' menu.h main.c   

-q, --quiet, --silent     suppress all normal output

options=(
    A
    B
    C
)

for i in "${options[@]}"; do
    if grep -q "${i}" $file; then
        echo "${i}" # ${i##*/} is a parametr expansion 
                    #it removes left side of string till last slash
    fi
done

관련 정보