![grep 명령에서 -q 매개변수의 용도는 무엇입니까? [폐쇄]](https://linux55.com/image/209933/grep%20%EB%AA%85%EB%A0%B9%EC%97%90%EC%84%9C%20-q%20%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98%EC%9D%98%20%EC%9A%A9%EB%8F%84%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F%20%5B%ED%8F%90%EC%87%84%5D.png)
echo "$password" | grep -q [A-Z]
-q
이 명령은 무엇을 합니까?
답변1
-q
grep
패턴과 일치하는 행이 발견되면 성공 상태로 종료하고, 입력에서 일치하는 행이 발견되지 않으면 실패 상태로 종료하고, 그렇지 않으면 표준 출력에 아무것도 인쇄하지 않도록 지시합니다 .
일반적으로 다음과 같은 상황에서 사용됩니다.
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
파일이 있는 경우 쉘은 해당 파일로 확장되므로 결국 다음을 실행하게 됩니다 . 및 파일에 있는 파일이 .A
Z
X
[A-Z]
grep -q A X Z
A
X
Z
- 패턴 일치는
[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 상태를 반환합니다.