web-dev-qa-db-fra.com

Comment supprimer des zéros de premier plan de la production de «date» ou d'éviter une interprétation octale de tels nombres décimaux?

J'ai ceci:

date +"%H hours and %M minutes"

J'utilise le festival pour le dire .. mais cela dit comme: "zéro neuf heures" .. Je veux qu'il dise "neuf heures"!

mais la date donnez-moi toujours 09 ... Alors je me demande si Bash peut facilement faire cela devenir seulement 9?

dans le script complexe, j'ai essayé comme

printf %d 09

mais ça échoue .. pas octal :(

une idée?

40
Aquarius Power
  • Dans votre cas, vous pouvez simplement désactiver zéro remplissage en appends - après % Dans la chaîne de format de date: %-H

    Par défaut, les champs numériques de la date de la date avec des zéros. Les drapeaux optionnels suivants peuvent suivre "%":

    • - (un trait d'union) Ne pas rembourrer le champ
    • _ (souligné) coussinet avec des espaces
    • 0 (zéro) tampon avec zéros
    • ^ utiliser majuscule si possible
    • # utiliser le cas opposé si possible

    Voir Manuel de date

  • Si vous souhaitez interpréter le numéro dans une base différente, à bash

    • Les constantes ayant un 0 de premier plan sont interprétées comme des nombres octals.
    • Un 0x de premier plan ou 0x dénote hexadécimal.
    • Sinon, les numéros prennent la forme [BASE #] N, où la base est un nombre décimal entre 2 et 64 représentant la base arithmétique et n est un nombre dans cette base

    Donc, pour interpréter un nombre comme décimal, utilisez 10#n forme, par exemple. 10#09

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

    Voir Évaluation arithmétique Section du manuel Bash.

51
LiuYan 刘研

Si vous essayez de faire des comparaisons en décimale avec les valeurs de date, j'ai trouvé que cette méthode est très efficace:

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

Cela donne toujours une valeur décimale. Donc je peux faire ceci:

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

Il n'y a pas de problème avec 08 ou 09 de cette façon. L'utilisation de% 10 au lieu de% 100 vous donne des gammes de dix minutes de 0 à 9. Je trouve également les valeurs décimales, sans que les zéros sont de premier plan:

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

Portablement, vous pouvez facilement supprimer un 0 à partir d'une variable. Cela laisse la variable inchangée s'il n'y a pas de dirigeant 0.

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

À Bash, Ksh ou ZSH, vous pouvez utiliser les modèles de globules supplémentaires de KSH pour supprimer n'importe quel nombre de dirigeants 0s. En bash, courez shopt -s extglob premier. Dans ZSH, courez setopt kshglob premier.

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

En général à Bash:

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

résultant en

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

Ou, différent:

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

Je suis surpris que la date ne dispose pas d'options de format appropriées.

1
Hauke Laging