이 옵션 중 어느 것도 작동하지 않는 것 같습니다. 내가 도대체 뭘 잘못하고있는 겁니까? ( leapb
및 leapc
는 iyr
정수 값입니다)
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 ]]
a
and 값 b
, 심지어 문자열, 비어 있거나 설정되지 않은 값 에도 오류가 없습니다 .
[[
is 의 이전 버전 [
이지만 그 버전도 적절하게 인용되어 있습니다.
[ "$a" -eq "$b" ]
a
or 안의 값이 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=0
은 leapb=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
빈 문자열입니다.
하지만 구문을 사용하면 [[ ... ]]
테스트가 자동으로 실패합니다.
관련 자료: