bash: 부울 연산 및 단항 '!'

bash: 부울 연산 및 단항 '!'

나는이 코드를 발견했습니다.진짜해당 연도가 윤년인 경우,잘못된그렇지 않으면. year명령줄에서 읽은 사용자 입력입니다.

(( !(year % 4) && year % 100 || !(year % 400) )) && echo "true" || echo "false"

1달러는 어때요?!원하는 결과를 얻기 위해 bash로 구현되었나요?

산술 명령 반환 값에 대해 내가 아는 것: ((10 > 6)); echo "$?"# 출력 0. 산술 명령은 true인 경우 0을 반환합니다.

위 명령의 반환 값, 즉 종료 코드를 호출할 수 있나요?

내가 아는 전부!:'! ' 값을 부울로 강제할 뿐만 아니라 패리티도 뒤집습니다.

답변1

!(year % 4)산술적 맥락에서는 결과가 먼저 취해지며 year % 40과 3 사이의 값이 산출됩니다. 값이 0( year4의 배수)이면 전체 연산의 결과는 1( !0)이고, 그렇지 않으면 !1, !2, 또는 입니다 !3. 이들은 모두 0으로 평가됩니다.

이는 대부분의 언어에서 정수의 부울 평가를 위한 표준 관행입니다.

0 && 3부울 산술 평가에서는 정수 0이 거짓이므로 다음과 같은 연산이 가능합니다.

이것종료 코드명령의 값 (( 10 > 6 ))은 0입니다. 이는 예를 들어(예: 1)에서 얻은 출력과 다릅니다 echo "$(( 10 > 6 ))". 종료 코드는 "성공" 또는 "실패"를 나타냅니다. 테스트가 성공적으로 실행되었으므로 0이 반환됩니다. 산술적 맥락에서 비교를 사용하는 경우 해당 값은 1이 됩니다.

(( var = 10 > 6 ))
echo "$var"   # prints 1

!작동 원리는 산술적 맥락을 제외하면 동일합니다. 0을 1로 바꾸고 0이 아닌 것을 0으로 바꿉니다. 이것설명하다그러나 쉘은 이를 다르게 이해합니다. 0은 "부울 오류"가 아닌 "성공"을 의미합니다(쉘 유틸리티를 "성공"보다는 "실패하지 않음"으로 생각하는 데 더 익숙하다면 이는 놀라운 일이 아닐 수 있습니다).

grep -q -e PATTERN file && echo 'grep did not fail (and found PATTERN)'

! grep -q -e PATTERN file && echo 'grep failed (and did not find PATTERN)'

Unix에서 0 반환 코드는 추가 정보를 전달할 필요가 없기 때문에 "성공"을 나타냅니다.

0이 아닌 종료 코드로 인해 실패가 발생합니다. 실패의 성격은 종료 코드의 실제 값으로 표시됩니다. 유효한 오류 코드는 1-127입니다. 이들의 의미는 유틸리티 매뉴얼에 문서화되어야 합니다. 위의 종료 상태는 유틸리티가 신호에 의해 종료된 경우의 상태입니다.

관련 정보