Bash가 정수 대신 8진수 코드를 해석하지 못하게 하는 방법은 무엇입니까?

Bash가 정수 대신 8진수 코드를 해석하지 못하게 하는 방법은 무엇입니까?

저는 Unix/Linux 프로젝트에 대한 소개로 Constellation 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을 입력하는 것이 유효하기 때문에 이것이 문제라고 생각합니다. 또한 0323이 나에게 양자리(-gt 0320 && -lt 0332)를 제공해야 하지만 물병자리(날짜는 -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)).

관련 정보