논리

논리

이러한 옵션 중 어느 것도 작동하지 않는 것 같습니다. 내가 뭘 잘못했나요? ( leapbleapciyr정수 값입니다)

if [[ $leapb -eq $iyr && $leapc -ne $iyr ]]; then
  leap=0
fi

또는,

if [[ $leapb -eq $iyr ]] && [[ $leapc -ne $iyr ]]; then
  leap=0
fi

iyr=1979, 를 사용하여 leapb=1900이 스크립트를 실행할 때 leapc=1600스크립트가 해당 leap=0행에 도달하지 못하고 오류 메시지가 -eq: unary operator expected.

답변1

단순화된 코드 버전 사용:

[[ $a -eq $b ]]

aband 값 , 심지어 문자열, 비어 있거나 설정되지 않은 값 에도 오류가 없습니다 .

이전 버전 [[은 이지만 [, 그럼에도 불구하고 올바르게 인용되었습니다.

[ "$a" -eq "$b" ]

aor 의 값이 b문자열(또는 비어 있거나 설정되지 않은 경우)인 경우에만 불평합니다.

./script: line 13: [: StringInsideA: integer expression expected

이는 테스트 중인 실제 코드가 [두 가지를 모두 사용함을 의미합니다.아니요참조 변수 확장(나쁜 생각):

[ $a -eq $b ]

이 경우 일부 값이 a비어 있거나 설정되지 않은 경우 b(또는 그 반대) 보고되는 오류는 다음과 같습니다.

./script: line 14: [: -eq: unary operator expected

결론: [[테스트 버전(bash, ksh, zsh)을 사용하시기 바랍니다.

논리

보고한 값의 경우:

leapb=1900다음 과 같은 경우를 이해하세요 iyr=1979(예:같지 않음) 첫 번째 테스트는 실패하고 leap=0값에 관계없이 leapc실행되지 않습니다 .

그런 다음 실행하는 유일한 방법 leap=0leapb=iyrleapc아니요동일한 iyr.

더 간단하다

연도가 윤년인지 감지하려면 다음 명령을 사용하십시오.

leap=$(( y>0 && ( y%4==0 && y%100>0 || y%400==0 ) ))

이 공식에서는 윤년이면 1이고 그렇지 않으면 0입니다.

답변2

bash귀하의 코드에서 오류를 재현할 수 없습니다 . 주어진 값에 대해 코드는 와 동일하지 않기 leap=0때문에 해당 값에 도달하지 않습니다.$iyr$leapb

그러나 다음과 같이 수정하면:

if [ $leapb -eq $iyr ] && [ $leapc -ne $iyr ]; then
    leap=0
fi

그러면 이것은 생산될 것입니다

[: -eq: unary operator expected

if는 $leapb빈 문자열입니다.

구문을 사용하면 [[ ... ]]테스트가 자동으로 실패합니다.

관련 독서:

관련 정보