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

35

Eu tenho isso:

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 a data sempre me dá 09 ... então eu me pergunto se o bash pode facilmente tornar isso apenas 9?

no script complexo eu tentei gostar

printf %d 09

mas falha .. não octal: (

alguma ideia?

    
por Aquarius Power 03.04.2013 / 04:43

4 respostas

44
  • No seu caso, você pode simplesmente desabilitar o preenchimento zero anexando - após % na sequência de formatações de data: %-H

    By default, date pads numeric fields with zeroes. The following optional flags may follow '%':

    • - (hyphen) do not pad the field
    • _ (underscore) pad with spaces
    • 0 (zero) pad with zeros
    • ^ use upper case if possible
    • # use opposite case if possible

    Veja o manual de datas

  • Se você quiser interpretar o número em diferentes bases, no bash

    • Constants with a leading 0 are interpreted as octal numbers.
    • A leading 0x or 0X denotes hexadecimal.
    • Otherwise, numbers take the form [base#]n, where base is a decimal number between 2 and 64 representing the arithmetic base, and n is a number in that base

    Então, para interpretar um número como decimal, use 10#n form, por exemplo. 10#09

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

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

por 03.04.2013 / 05:49
2

Portável, você pode remover facilmente um 0 inicial de uma variável. Isso deixa a variável inalterada se não houver nenhum 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 0 s. No bash, execute shopt -s extglob primeiro. Em zsh, execute setopt kshglob primeiro.

eval $(date +"h=%H m=%M")
h=${h#+(0)}
m=${m#+(0)}
say "$h hours and $m minutes"
    
por 04.04.2013 / 03:36
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]\)//g' -e p

Surpreende-me que a data não tenha opções de formato adequadas.

    
por 03.04.2013 / 05:08
1

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

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

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

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

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

echo "$((10#$(date +%M)))"
    
por 19.12.2015 / 17:44