Usando a expansão aritmética bash “double paren”, a matemática falha com zero à esquerda

6

Eu tenho um script simples que lida com horas e minutos.

Se eu quiser calcular o número de minutos desde a meia-noite com uma string s hh:mm , tentei dividir a string e fazer hh * 60 + mm

Meu problema é que, enquanto

$ (( tot = 12 * 60 + 30 ))
$ echo $tot
750

em vez

$ (( tot = 09 * 60 + 30 ))
bash: ((: tot = 09: value too great for base (error token is "09")

Até onde eu sei, a string 09 não deve ser um número base 10.

Existe uma maneira melhor do que simplesmente remover zeros à esquerda na string?

    
por neurino 24.08.2011 / 10:38

2 respostas

11
h=09; m=30;(( tot = 10#$h * 60 + 10#$m )); echo $tot  

O número antes do # é a base (ou base)
O número após o # deve ser válido para o radix
A saída é sempre decimal
Você pode usar uma raiz de 2 a 64 (no GNU bash 4.1.5)

Como foi observado por enzoyib , a alternativa antiga de $ [expression] é depreciada, então é melhor usar o% POSI $((expr))

$(( 2#1)) ==  1
$((16#F)) == 15
$((36#Z)) == 35  

Não tenho certeza de quais "dígitos" são usados depois de Z

    
por 24.08.2011 / 10:46
5

Um zero inicial em uma constante numérica em expressões aritméticas de shell indica uma constante octal.

Aqui está uma maneira portátil de excluir zeros iniciais:

h=${h#${h%%[!0]*}}; [ -n "$h" ] || h=0

No bash, ksh ou zsh, você pode especifica explicitamente a base 10 com $((10#$h)) .

    
por 24.08.2011 / 23:49