¿Cómo elimino los ceros a la izquierda de la salida de 'fecha' o evito la interpretación octal de tales números decimales?

37

Tengo esto:

date +"%H hours and %M minutes"

Uso el festival para decirlo ... pero dice: "cero nueve horas" ... ¡quiero que diga "nueve horas"!

pero la fecha siempre me da 09 ... así que me pregunto si bash puede hacer que se convierta en solo 9.

en el complejo script que intenté como

printf %d 09

pero falla ... no octal :(

¿alguna idea?

Poder de acuario
fuente
OP, su respuesta aceptada es excelente, para su caso específico, pero no coincide con el título de la pregunta.
einpoklum - reinstalar a Monica el
@ilkkachu el antiguo título fue clave para encontrar esta pregunta, buscando forzar la interpretación decimal de los números en formato octal.
muru
@muru, sí, pensé que si podía pegar la nota sobre octal allí, pero no se me ocurrió una frase agradable. Podrías cambiarlo, por supuesto, ¿al menos sabes lo que buscaste? Las respuestas y preguntas todavía parecen ser principalmente sobre la eliminación del cero inicial.
ilkkachu

Respuestas:

49
  • En su caso, simplemente puede deshabilitar el relleno cero agregando -después %en la cadena de formato de fecha:%-H

    De manera predeterminada, los campos numéricos de los pads de fecha con ceros. Los siguientes indicadores opcionales pueden seguir a '%':

    • - (guión) no rellene el campo
    • _ (subrayado) almohadilla con espacios
    • 0 (cero) almohadilla con ceros
    • ^ use mayúsculas si es posible
    • # use el caso opuesto si es posible

    Ver manual de fecha

  • Si desea interpretar el número en una base diferente, en bash

    • Las constantes con un 0 inicial se interpretan como números octales.
    • Un 0x o 0X inicial denota hexadecimal.
    • De lo contrario, los números toman la forma [base #] n, donde base es un número decimal entre 2 y 64 que representa la base aritmética, yn es un número en esa base

    Entonces, para interpretar un número como decimal, use la 10#nforma, por ejemplo.10#09

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

    Consulte la sección Evaluación aritmética del manual de bash.

LiuYan 刘 研
fuente
2
gracias, muy detallado! por cierto, echo $((011)) $((10#011))es otro buen ejemplo que sale9 11
Aquarius Power
1
Esto no funciona para números negativos: lat=048 ; latd=${lat#0} ; echo $((latd-1))funciona, pero lat=-048 ; latd=${lat#0} ; echo $((latd-1))no funciona.
Luis A. Florit
plus=$((10#01))
Dr Beco
2

Si está intentando hacer comparaciones en decimal con valores de fecha, he encontrado que este método es muy efectivo:

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

Eso siempre produce un valor decimal. Entonces puedo hacer esto:

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

No hay problema con 08 o 09 de esta manera. El uso de% 10 en lugar de% 100 le ofrece rangos de diez minutos de 0 a 9. También encuentro que lo siguiente da valores decimales, sin ceros a la izquierda:

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

Portablemente, puede eliminar fácilmente un líder 0de una variable. Esto deja la variable sin cambios si no hay guía 0.

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

En bash, ksh o zsh, puede usar los patrones de glob adicionales de ksh para eliminar cualquier número de 0s iniciales . En bash, corre shopt -s extglobprimero. En zsh, corre setopt kshglobprimero.

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

En general en bash:

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

Resultando en

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

O diferente:

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

Me sorprende que la fecha no tenga las opciones de formato adecuadas.

Hauke ​​Laging
fuente