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

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

나는 Unix/Linux 프로젝트에 대한 소개로 Horscope 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 사이에는 작동하지 않습니다. 그는 Capricorn에서 앞에 0을 붙이지 않고 113을 입력했기 때문에 그것이 문제라고 생각했습니다. 또한 나에게 양자리(-gt 0320 && -lt 0332)를 제공해야 했던 0323이 나에게 물병자리(날짜는 -gt 0119 && -lt 0132 || -gt 0200 && -lt 0219)를 제공하는 문제에 직면했습니다. 0417은 작동하지 않습니다(양자리의 다른 날짜 범위, -gt 0400 && -lt 0420).

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

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

하지만 그것은 효과가 없었습니다. 이 문제에 대해 나를 도와줄 수 있는 사람에게 미리 감사드립니다!

답변1

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

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

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

관련 정보