논리

논리

이 옵션 중 어느 것도 작동하지 않는 것 같습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? ( 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 ]]

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

[[is 의 이전 버전 [이지만 그 버전도 적절하게 인용되어 있습니다.

[ "$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=iyr다음과 leapc같습니다.~ 아니다동일 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빈 문자열입니다.

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

관련 자료:

관련 정보