이러한 옵션 중 어느 것도 작동하지 않는 것 같습니다. 내가 뭘 잘못했나요? ( 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
b
and 값 , 심지어 문자열, 비어 있거나 설정되지 않은 값 에도 오류가 없습니다 .
이전 버전 [[
은 이지만 [
, 그럼에도 불구하고 올바르게 인용되었습니다.
[ "$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
빈 문자열입니다.
구문을 사용하면 [[ ... ]]
테스트가 자동으로 실패합니다.
관련 독서: