안녕하세요, 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
디렉터리의 나머지 부분을 반복하고 데이터를 메모리로 읽는 것을 방지하여 더 깨끗하고 일치하는 첫 번째 줄에서 중지합니다.