grep 명령에서 -q 매개변수의 용도는 무엇입니까? [폐쇄]

grep 명령에서 -q 매개변수의 용도는 무엇입니까? [폐쇄]
echo "$password" | grep -q [A-Z]

-q이 명령은 무엇을 합니까?

답변1

-qgrep패턴과 일치하는 행이 발견되면 성공 상태로 종료하고, 입력에서 일치하는 행이 발견되지 않으면 실패 상태로 종료하고, 그렇지 않으면 표준 출력에 아무것도 인쇄하지 않도록 지시합니다 .

일반적으로 다음과 같은 상황에서 사용됩니다.

if grep -q foo file; then
  echo file contains foo
fi

또는:

find . -type f -exec grep -q foo {} \; \
               -exec printf '"%s" contains foo\n' {} \;

또는:

<"$file" grep -q -xFe "$expected_line" ||
  die "Expected line not found in $file"

여기서 코드 예제는 여러 가지 이유로 잘못되었습니다.

  • [A-Z][A-Z]는 쉘 glob 연산자이기도 하므로 인수가 문자 그대로 에 전달되도록 따옴표로 묶어야 합니다 . 예를 들어, 이름 이 이고 현재 디렉토리에 grep파일이 있는 경우 쉘은 해당 파일로 확장되므로 결국 다음을 실행하게 됩니다 . 및 파일에 있는 파일이 .AZX[A-Z]grep -q A X ZAXZ
  • 패턴 일치는 [A-Z]로케일마다 다르며 일반적으로 다소 무작위입니다. ABCDEFGHIJKLMNOPQRSTUVWXYZ사용자가 일반적으로 의도한 대로 문자를 일치시키 려면 [A-Z]가 필요합니다 [ABCDEFGHIJKLMNOPQRSTUVWXYZ].
  • echo구현에 따라 백슬래시 포함 및/또는 -. 로 끝나기 때문에 임의의 데이터를 출력하는 데 사용할 수 없습니다.
  • 또한 입력이 텍스트가 아닌 경우의 동작은 지정되지 않았으므로 먼저 콘텐츠가 사용자 로케일에서 유효한 텍스트인지 grep확인하는 것이 좋습니다 .$password

그래서 여기 있습니다:

if
  printf '%s\n' "$password" | grep -q '[ABCDEFGHIJKLMNOPQRSTUVWXYZ]'
then
  echo the password contains at least one ASCII uppercase letter
fi

또는:

if
  printf '%s\n' "$password" | grep -q '[[:upper:]]'
then
  echo "the password contains at least one letter considered uppercase in the user's locale"
fi

더 정확할 것입니다. POSIX 셸에서는 그럴 필요가 없지만 grep다음과 같이 할 수 있습니다.

case $password in
  (*[ABCDEFGHIJKLMNOPQRSTUVWXYZ]*) echo contains ASCII uppercase;;
  (*[[:upper:]]*) echo no ASCII uppercase, but some other uppercase;;
  (*) echo no uppercase;;
esac

답변2

-q, --조용함, --무음

정상적인 출력을 억제합니다. 오류가 발생하더라도 첫 번째 적중 직후 검색이 종료되고 0 상태를 반환합니다.

관련 정보