나는이 코드를 발견했습니다.진짜해당 연도가 윤년인 경우,잘못된그렇지 않으면. year
명령줄에서 읽은 사용자 입력입니다.
(( !(year % 4) && year % 100 || !(year % 400) )) && echo "true" || echo "false"
1달러는 어때요?!원하는 결과를 얻기 위해 bash로 구현되었나요?
산술 명령 반환 값에 대해 내가 아는 것:
((10 > 6)); echo "$?"
# 출력 0. 산술 명령은 true인 경우 0을 반환합니다.
위 명령의 반환 값, 즉 종료 코드를 호출할 수 있나요?
내가 아는 전부!:'! ' 값을 부울로 강제할 뿐만 아니라 패리티도 뒤집습니다.
답변1
!(year % 4)
산술적 맥락에서는 결과가 먼저 취해지며 year % 4
0과 3 사이의 값이 산출됩니다. 값이 0( year
4의 배수)이면 전체 연산의 결과는 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입니다. 이들의 의미는 유틸리티 매뉴얼에 문서화되어야 합니다. 위의 종료 상태는 유틸리티가 신호에 의해 종료된 경우의 상태입니다.