"grep -q" 및 "if [-n/-z]"

"grep -q" 및 "if [-n/-z]"

안녕하세요, dmenu와 함께 작동하는 NetworkManager용 작은 래퍼 스크립트가 있습니다. 가능한 한 간단하고 완전히 posix이기를 원합니다.

저는 shellcheck를 사용하고 있는데 다음 줄에 대해 "경고"가 표시됩니다.

...
if [ -z "$(echo "$VAR" | grep "pattern")" ] && [ -z "$(grep -w $OtherVar ~/somefile)" ]
...

grep -q그것(shellcheck)은 대신 ​​사용해야 한다고 말하지만 [ -z ]bash 및 grep에 대한 매뉴얼 페이지를 읽고 다시 읽은 후에는 그것이 grep -q실제로 내가 사용하고 싶은 것이 아닌 것 같습니다. 아니면 그렇습니까? grep -q실제로 어떻게 비교됩니까 [ -z/-n]?

답변1

[ -z "$(echo "$VAR" | grep "pattern")" ]출력이 비어 있는지 확인 하는 조건을 넣으십시오 grep. grep을 사용하여 grep -q일치하는 항목이 있는지 확인하세요.

$var정규 표현식이 포함되어 있는지 알고 싶다면 $pattern다음을 사용할 수 있습니다.

if echo "$var" | grep -qe "$pattern"; then
    echo match
fi

혹은 if ! echo ...그 반대로도.

이것은 보고 있는 출력과 완전히 다릅니다 grep. 이론적으로는 0개의 문자로 구성된 문자열과 일치하는 패턴을 가질 수 있기 때문입니다. (그러나 모든 입력과 일치할 수 있습니다.)

[.. 거기 에는 없습니다 . 파이프를 조건으로 직접 ]사용합니다 . echo | grep종료 상태 확인if command주문하다[, 또는 다른 명령 일 수 있습니다 .

답변2

~에 따르면위키피디아

[ -z "$( grep -w ..) ]이 grep은 결정을 내리기 전에 전체 파일을 반복하고 일치하는 모든 줄을 메모리로 읽어옵니다.

grep -q디렉터리의 나머지 부분을 반복하고 데이터를 메모리로 읽는 것을 방지하여 더 깨끗하고 일치하는 첫 번째 줄에서 중지합니다.

관련 정보