다음 루프를 실행하려고 하는데 실패합니다. 이중 괄호와 기타 내용에 대해 읽었지만 작동하도록 할 수 없습니다(특히 공용체의 두 번째 부분에서는 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
( ) 유틸리티에 대한 인수이며 기본적으로 키워드 독립적입니다.[
test
if
유틸리티의 옵션을 사용 -q
하면 일치하는 항목이 발견되는 즉시 유틸리티가 조용해지고 종료되며( ) 지정된 패턴을 정규식 대신 텍스트 문자열로 처리합니다( ).-F
grep
-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
$b
grep
while
if
에서는 문자열 동일성 [ ... ]
을 =
테스트하고 -eq
정수 동일성을 테스트합니다. 기술적으로는 테스트에 유효한 연산자 ==
는 아니지만 지원됩니다. 사용되면 쉘은 아래와 같이 특수 구문에서 쉘 패턴 일치를 수행합니다.[ ... ]
bash
bash
[[ ... ]]
==
[[ $name == *.txt ]] && echo 'The name matches *.txt'