"Date" 출력에서 ​​선행 0을 제거하거나 이러한 10진수의 8진수 해석을 방지하려면 어떻게 해야 합니까?

"Date" 출력에서 ​​선행 0을 제거하거나 이러한 10진수의 8진수 해석을 방지하려면 어떻게 해야 합니까?

나는 이것을 가지고있다:

date +"%H hours and %M minutes"

축제라고 표현했는데.. "제로 나인 아워"라고 써있네요.. "나인 아워"라고 했으면 좋겠어요!

하지만 날짜는 항상 09를 제공하므로 bash가 쉽게 9를 만들 수 있는지 궁금합니다.

내가 시도한 복잡한 스크립트에서

printf %d 09

하지만 실패했습니다.. 8진수는 아닙니다. :(

어떤 아이디어가 있나요?

답변1

  • 귀하의 경우 -날짜 형식 문자열 뒤에 간단히 추가하여 제로 패딩을 비활성화할 수 있습니다.%%-H

    기본적으로 날짜는 숫자 필드를 0으로 채웁니다. '%' 뒤에는 다음과 같은 선택적 플래그가 올 수 있습니다.

    • -(하이픈) 이 필드를 채우지 마세요.
    • _(밑줄) 공백이 있는 패드
    • 0(제로) 0으로 채움
    • ^가능하면 대문자를 사용하세요
    • #가능하면 반대의 경우를 사용하세요

    바라보다데이트북

  • Bash에서 다른 베이스의 숫자를 해석하려는 경우

    • 0으로 시작하는 상수는 8진수로 해석됩니다.
    • 앞에 0x 또는 0X가 있으면 16진수를 나타냅니다.
    • 그렇지 않은 경우 숫자는 [base#]n 형식을 취합니다. 여기서 base는 산술 밑수를 나타내는 2~64 사이의 십진수이고 n은 해당 밑수의 숫자입니다.

    따라서 숫자를 십진수로 해석하려면 10#n다음 형식을 사용하세요.10#09

    echo $((10#09*2))
    18
    

    바라보다산술 평가Bash 매뉴얼의 일부입니다.

답변2

십진수 형식의 날짜 값과 비교하려는 경우 이 방법이 매우 효과적이라는 것을 알았습니다.

let mymin=$(date '+1%M') ; let mymin=$mymin%100

이는 항상 소수 값을 생성합니다. 그래서 나는 이것을 할 수 있습니다 :

if [[ $mymin -le 1 ]]; then   # only 0 and 1 are true.

이런 식으로 08과 09에는 문제가 없습니다. %100 대신 %10을 사용하면 0에서 9까지의 10분 범위가 제공됩니다. 또한 다음은 앞에 0이 없는 소수 값을 제공한다는 것을 발견했습니다.

echo "$((10#$(date +%M)))"

답변3

0이식 가능한 변수에서 선행을 쉽게 제거할 수 있습니다. 선행이 없으면 변수는 변경되지 않은 상태로 유지됩니다 0.

eval $(date +"h=%H m=%M")
h=${h#0}
m=${m#0}
say "$h hours and $m minutes"

bash, ksh 또는 zsh에서는 ksh의 추가 glob 모드를 사용하여 선행 s를 원하는 만큼 제거할 수 있습니다 0. Bash에서는 shopt -s extglob먼저 실행하십시오. zsh에서 setopt kshglob먼저 실행하십시오.

eval $(date +"h=%H m=%M")
h=${h#+(0)}
m=${m#+(0)}
say "$h hours and $m minutes"

답변4

일반적으로 bash에서는 다음과 같습니다.

test ${#number} -eq 2 && number=${number#0}

~로 이어지다

date +"%H %M" | 
{ read hours minutes
hours=${hours#0}
minutes=${minutes#0}
echo "${hours} hours and ${minutes} minutes"; }

또는 다르게:

date +"%H hours and %M minutes" | sed -n -e 's/0\([0-9]\)/\1/g' -e p

날짜에 대한 적절한 형식 지정 옵션이 없다는 것에 놀랐습니다.

관련 정보