Como removo os zeros à esquerda da saída de 'date' ou evito a interpretação octal desses números decimais?

37

Eu tenho isto:

date +"%H hours and %M minutes"

Eu uso o festival para dizer isso .. mas diz assim: "zero nove horas" .. eu quero dizer "nove horas"!

mas date sempre me dá 09 ... então eu me pergunto se o bash pode facilmente tornar isso apenas 9?

no script complexo eu tentei como

printf %d 09

mas falha .. não octal :(

qualquer ideia?

Poder do Aquário
fonte
OP, sua resposta aceita é ótima - para o seu caso específico, mas não corresponde ao título da pergunta.
einpoklum - reinstala Monica 13/09
@ilkkachu, o título antigo foi fundamental para que eu encontrasse essa pergunta, procurando forçar a interpretação decimal dos números no formato octal.
Muru
@ muru, sim, eu pensei que poderia colocar a nota sobre octal lá, mas não criei um bom fraseado. Você pode mudar, é claro, pelo menos sabe o que procurou? As respostas e perguntas ainda parecem principalmente sobre remover o zero inicial.
precisa saber é

Respostas:

49
  • No seu caso, você pode simplesmente desativar o preenchimento zero acrescentando -depois %na string de formato da data:%-H

    Por padrão, a data preenche os campos numéricos com zeros. Os seguintes sinalizadores opcionais podem seguir '%':

    • - (hífen) não preenchem o campo
    • _ bloco (sublinhado) com espaços
    • 0 almofada (zero) com zeros
    • ^ use maiúsculas, se possível
    • # use caso oposto, se possível

    Consulte o manual da data

  • Se você deseja interpretar o número em uma base diferente, no bash

    • As constantes com um 0 inicial são interpretadas como números octais.
    • Um 0x ou 0X inicial indica hexadecimal.
    • Caso contrário, os números assumem a forma [base #] n, em que base é um número decimal entre 2 e 64, representando a base aritmética, e n é um número nessa base.

    Portanto, para interpretar um número como decimal, use o 10#nformulário, por exemplo.10#09

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

    Consulte a seção Avaliação Aritmética do manual do bash.

LiuYan 刘 研
fonte
2
thx, muito detalhado! btw, echo $((011)) $((10#011))é outro exemplo bom que saídas9 11
Aquário de energia
11
Isso não funciona para números negativos: lat=048 ; latd=${lat#0} ; echo $((latd-1))funciona, mas lat=-048 ; latd=${lat#0} ; echo $((latd-1))não funciona.
Luis A. Florit
plus=$((10#01))
Dr Beco
2

Se você está tentando fazer comparações decimais com valores de data, achei esse método muito eficaz:

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

Isso sempre gera um valor decimal. Então eu posso fazer isso:

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

Não há nenhum problema com 08 ou 09 dessa maneira. Usar% 10 em vez de% 100 fornece intervalos de dez minutos de 0 a 9. Também acho que o seguinte fornece valores decimais, sem zeros à esquerda:

echo "$((10#$(date +%M)))"
Dickster
fonte
2

Portably, você pode remover facilmente um líder 0de uma variável. Isso deixa a variável inalterada se não houver avanço 0.

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

No bash, ksh ou zsh, você pode usar os padrões glob adicionais do ksh para remover qualquer número de 0s iniciais . No bash, execute shopt -s extglobprimeiro. No zsh, execute setopt kshglobprimeiro.

eval $(date +"h=%H m=%M")
h=${h#+(0)}
m=${m#+(0)}
say "$h hours and $m minutes"
Gilles 'SO- parar de ser mau'
fonte
1

Em geral no bash:

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

resultando em

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

Ou, diferente:

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

Estou surpreso que a data não tenha opções de formato apropriadas.

Hauke ​​Laging
fonte