'날짜'출력에서 선행 0을 제거하거나 그러한 십진수의 8 진 해석을 피하려면 어떻게해야합니까?


37

내가 이거 가지고있어:

date +"%H hours and %M minutes"

나는 축제를 사용하여 그것을 말하지만 .. 그것은 "제로 아홉 시간"이라고 말합니다. "나는 아홉 시간"이라고 말하고 싶습니다!

그러나 날짜는 항상 나에게 09를 줘. 그래서 배쉬가 그것을 9로 쉽게 만들 수 있는지 궁금해?

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

printf %d 09

그러나 그것은 실패합니다. 8 진수가 아닙니다 :(

어떤 생각?


OP, 특정 답변의 경우 답변이 훌륭하지만 질문 제목과 일치하지 않습니다.
einpoklum-복직 모니카

@ilkkachu 이전 제목은 8 진수 형식의 10 진수 해석을 강요 하면서이 질문을 찾는 데 핵심이었습니다.
muru

@muru, 그래, 나는 거기에 8 진수에 대한 메모를 붙일 수 있다고 생각했지만 좋은 문구를 찾지 못했습니다. 당신은 물론 그것을 바꿀 수 있습니다, 적어도 당신은 무엇을 검색했는지 알고 있습니까? 대답과 질문은 여전히 ​​주로 선행 0을 제거하는 것 같습니다.
ilkkachu 2018 년

답변:


49
  • 귀하의 경우 날짜 문자열 형식으로 -after %를 추가하여 제로 패딩을 비활성화 할 수 있습니다 .%-H

    기본적으로 날짜는 숫자 필드를 0으로 채 웁니다. 다음의 선택적 플래그는 '%'를 따를 수 있습니다.

    • - (하이픈) 필드를 채우지 마십시오
    • _ 공백이있는 (밑줄) 패드
    • 0 0이있는 패드
    • ^ 가능하면 대문자를 사용하십시오
    • # 가능하면 반대의 경우를 사용하십시오

    날짜 매뉴얼 참조

  • bash에서 다른베이스의 숫자를 해석하려면

    • 앞에 0이있는 상수는 8 진수로 해석됩니다.
    • 선행 0x 또는 0X는 16 진수를 나타냅니다.
    • 그렇지 않은 경우 숫자는 [base #] n 형식을 취합니다. 여기서 base는 산술 기준을 나타내는 2에서 64 사이의 10 진수이며 n은 해당 기준의 숫자입니다.

    따라서 숫자를 십진수로 해석하려면 10#n양식을 사용하십시오 .10#09

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

    bash 매뉴얼의 산술 평가 섹션을 참조하십시오 .


2
thx, 매우 상세한! btw echo $((011)) $((10#011))는 또 다른 좋은 예입니다9 11
Aquarius Power

1
음수에는 작동 하지 않습니다. lat=048 ; latd=${lat#0} ; echo $((latd-1))작동하지만 작동 lat=-048 ; latd=${lat#0} ; echo $((latd-1))하지 않습니다.
Luis A. Florit

plus=$((10#01))
Dr Beco

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이 나오지 않고 10 진수 값이 표시됩니다.

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

2

다행스럽게도 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 패턴을 사용하여 여러 선행 문자를 제거 할 수 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"

1

일반적으로 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

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

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