grep 및 변수 동등성을 사용하여 while 루프를 작동시키는 방법은 무엇입니까?

grep 및 변수 동등성을 사용하여 while 루프를 작동시키는 방법은 무엇입니까?

다음 루프를 실행하려고 하는데 실패합니다. 이중 괄호와 기타 내용에 대해 읽었지만 작동하도록 할 수 없습니다(특히 공용체의 두 번째 부분에서는 grep). 각 부분을 개별적으로 작동하게 할 수는 있지만 두 부분을 함께 작동시킬 수는 없습니다.

첫 시도:

a=1;
b=1;

while { ( n1=$(grep 'too many requests' *.htm* )) && (( $a -eq $b  )) }; do
    echo "aa"
done
    

두 번째 시도:

while [[  n=$(grep 'too many requests' *.htm* ) && $a==$b ]]; do
    echo "error"
done

세 번째 시도

while [[  n=$(grep 'too many requests' *.htm* ) &&  "$a" -eq "$b"  ]]; do
    echo "aa"
done

a내 예상은 다음과 같습니다 . HTML 파일에 "너무 많은 요청"이라는 문구가 포함되어 있지 않으면 b루프를 입력합니다.

답변1

a=1
b=1

if ! grep -q -F -- 'too many requests' *.htm* && [ "$a" = "$b" ]; then
    echo error >&2
fi

이는 음의 종료 상태 grep와 비교 합계의 결과를 사용하여 문자열 동일성을 $a표현합니다 $b( 정수 동일성 평가에는 ['를 사용합니다). -eq둘 다라면진짜(문자열은 일치하는 파일에서 찾을 수 없으며 *.htm*두 변수는 모두 동일합니다.) echo그런 다음 문자열이 실행되어 error표준 오류 스트림으로 문자열을 출력합니다.

싱글을 사용 =하고 그 주위에 공백을 추가하는 것에 주목하세요. =(또는 ) 연산자는 -eq( ) 유틸리티에 대한 인수이며 기본적으로 키워드 독립적입니다.[testif

유틸리티의 옵션을 사용 -q하면 일치하는 항목이 발견되는 즉시 유틸리티가 조용해지고 종료되며( ) 지정된 패턴을 정규식 대신 텍스트 문자열로 처리합니다( ).-Fgrep-q-F


귀하의 예에서는 while루프를 사용하므로 if문이어야 합니다. 각 파일을 개별적으로 처리하려면 루프를 사용하십시오 for.

for name in *.htm*; do
    if ! grep -q -F -- 'too many requests' "$name" && [ "$a" = "$b" ]
    then
        printf 'error for "%s"\n' "$name" >&2
    fi
done

grep파일이나 파일 집합에서 패턴이 일치하는지 여부만 테스트하려는 경우 출력을 저장할 필요가 없습니다. 대신 grep -q위에 표시된 대로 유틸리티의 종료 상태를 사용하고 이에 반응할 수 있습니다 .

첫 번째 코드 조각에서는 산술 평가인 를 사용합니다 . 이는 부울 값으로 사용할 수 있는 문의 결과를 (( $a -eq $b ))계산하는 것으로 작성하는 것이 더 좋습니다 . 이 연산자는 유틸리티별로 적용 되며 에는 영향을 주지 않습니다 .(( a == b ))if-eq[(( ... ))

두 번째 코드 조각에서는 를 사용합니다 . 이는 셸이 명령으로 사용하려고 시도하는 $a==$b문자열로 평가됩니다 .1==1

세 번째 코드 조각에서는 와 사이의 정수 동일성 테스트를 "$a" -eq "$b"올바르게 수행하는 inside 를 사용합니다. [[ ... ]]명령과 종료 상태를 부정하지 않는 방식(및 명령문 대신 루프를 사용하고 있다는 사실) 때문에 이는 예상대로 작동하지 않습니다.$a$bgrepwhileif

에서는 문자열 동일성 [ ... ]=테스트하고 -eq정수 동일성을 테스트합니다. 기술적으로는 테스트에 유효한 연산자 ==는 아니지만 지원됩니다. 사용되면 쉘은 아래와 같이 특수 구문에서 쉘 패턴 일치를 수행합니다.[ ... ]bashbash[[ ... ]]==

[[ $name == *.txt ]] && echo 'The name matches *.txt'

관련 정보