Bash가 정수 대신 8 진수 코드를 해석하지 못하게하려면 어떻게해야합니까?


13

유닉스 / 리눅스 프로젝트의 소개로 Horoscope RSS 스크립트를 작성하고 있는데, 수업 후에도 교수님이 고칠 수없는 문제가 발생했습니다. 실제 날짜를 확인하는 방법을 알 수 없으므로 사용자 입력을 MMDD 형식의 표준 숫자로 사용하여 기본 산술을 시도한다고 생각했습니다. 그에 따르면, 스크립트는 입력 값을 정수 대신 8 진수 코드로 읽는 것 같습니다. 다음은 스크립트 샘플입니다.

    elif [ "$olddate" -gt 1121 ] && [ "$olddate" -lt 1131 ] || [ "$olddate" -gt 1200 ] && [ "$olddate" -lt 1222 ]
then
echo "You are Sagittarius"
exit
elif [ "$olddate" -gt 1221 ] && [ "$olddate" -lt 1232 ] || [ "$olddate" -gt 0100 ] && [ "$olddate" -lt 0120 ]
then
echo "You are Capricorn"
exit

이것은 맨손으로 RSS 부분을 꺼 냈습니다. "olddate"는 내 읽기 프롬프트에서 예상되는 입력입니다. 1121 ~ 1131, 1200 ~ 1222 및 0100 ~ 0120은 작동하지만 1221 ~ 1232 사이에는 작동하지 않습니다. 그는 염소 자리에 0을 넣지 않고 113을 넣은 이후로 이것이 문제라고 생각했습니다. 나는 또한 양자리 (-gt 0320 && -lt 0332)를 줘야했던 0323이 물병 자리 (날짜는 -gt 0119 && -lt 0132 || -gt 0200 && -lt 0219)를 줬던 문제에 부딪쳤다. 0417이 작동하지 않습니다 (Aries의 다른 날짜 범위 -gt 0400 && -lt 0420).

BASH가 입력을 실제 숫자로 해석하도록하려면 어떻게해야합니까? "userdate"를 입력으로 예상하도록 읽기 프롬프트를 변경 한 후 추가하려고했습니다.

olddate=`printf '%d\n' "$userdate"`

그러나 그것은 효과가 없었습니다. 나를 도울 수있는 사람에게 미리 감사드립니다!


bash 4.4.12에서는 복제 할 수 없습니다.
Ignacio Vazquez-Abrams 1

1
$ olddate는 숫자가 아닌 문자열이므로 문자열 비교를 사용하고 전체 혼란을 피하십시오.
스티븐 해리스

2
@StephenHarris : 연산자의 오른쪽에있는 값도 마찬가지입니다. 그래서 test명시적인 숫자 연산자가 있습니다.
Ignacio Vazquez-Abrams 1

주목해야 할 한 가지 핵심 질문과 관련이 있지만 조디악 표지판은 생년월일이 2 개의 조디악 표지판 사이의 전환에 가까운 경우 태어난 해에 부분적으로 의존한다는 것입니다. 조디악 표지판은 태어날 당시 태양이 있던 하늘의 1/12 번째 부분을 기준으로하지만 1 년의 일수가 정수 나 12로 나눌 수 없기 때문에 약간의 차이가 있습니다. 해마다. 이 변형은 if-else 트리에서 실제로 캡처하기에는 너무 복잡하지만 알아두면 좋을 것입니다.
Nzall

답변:


28

다음과 같이 bash에서 숫자를 특정 기준으로 강제 변환 할 수 있습니다.

$ foo=400
$ echo $((8#$foo))
256
$ bar=0100
$ echo $((10#$bar))
100

일반적으로 형식은 $((base#value))입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.