Wie entferne ich führende Nullen aus der Ausgabe von 'date' oder vermeide die oktale Interpretation solcher Dezimalzahlen?


37

Ich habe das:

date +"%H hours and %M minutes"

Ich benutze Festival, um es zu sagen .. aber es sagt wie: "neun Stunden Null" .. Ich möchte, dass es "neun Stunden" sagt!

aber datum gib mir immer 09 ... also frage ich mich, ob bash das einfach zu 9 machen kann?

in dem komplexen script habe ich gerne probiert

printf %d 09

aber es schlägt fehl .. nicht oktal :(

irgendeine Idee?


OP, Ihre akzeptierte Antwort ist großartig - für Ihren speziellen Fall, aber sie stimmt nicht mit dem Fragentitel überein.
einpoklum - wieder Monica

@ilkkachu der alte titel war der schlüssel für mich, diese frage zu finden und nach einer erzwungenen dezimalinterpretation von zahlen im oktalformat zu suchen.
muru

@muru, yeah, ich dachte, ich könnte die Notiz über das Oktal dort festhalten, aber ich habe keine schöne Formulierung gefunden. Sie könnten es natürlich ändern, zumindest wissen Sie, wonach Sie gesucht haben? Die Antworten und Fragen scheinen sich immer noch hauptsächlich auf das Entfernen der führenden Null zu beziehen.
Ilkkachu

Antworten:


49
  • In Ihrem Fall können Sie das Auffüllen mit Nullen einfach deaktivieren, indem Sie im Format string of date -nach anhängen %:%-H

    Das Datum füllt numerische Felder standardmäßig mit Nullen auf. Die folgenden optionalen Flags können auf '%' folgen:

    • - (Bindestrich) Feld nicht auffüllen
    • _ (Unterstrich) Pad mit Leerzeichen
    • 0 (Null-) Pad mit Nullen
    • ^ Verwenden Sie nach Möglichkeit Großbuchstaben
    • # Verwenden Sie nach Möglichkeit den umgekehrten Fall

    Siehe Datumshandbuch

  • Wenn Sie eine Zahl in einer anderen Basis interpretieren möchten, geben Sie bash ein

    • Konstanten mit einer führenden 0 werden als Oktalzahlen interpretiert.
    • Ein führendes 0x oder 0X bedeutet hexadezimal.
    • Ansonsten haben Zahlen die Form [base #] n, wobei base eine Dezimalzahl zwischen 2 und 64 ist, die die arithmetische Basis darstellt, und n eine Zahl in dieser Basis ist

    Um eine Zahl als Dezimalzahl zu interpretieren, verwenden Sie die 10#nForm, z.10#09

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

    Siehe Abschnitt " Arithmetische Auswertung " im bash-Handbuch.


2
Danke, sehr detailliert! Übrigens echo $((011)) $((10#011))ist ein weiteres gutes Beispiel, das ausgibt9 11
Aquarius Power

1
Dies funktioniert nicht für negative Zahlen: lat=048 ; latd=${lat#0} ; echo $((latd-1))funktioniert, aber lat=-048 ; latd=${lat#0} ; echo $((latd-1))nicht.
Luis A. Florit

plus=$((10#01))
Dr. Beco

2

Wenn Sie versuchen, Vergleiche in Dezimalzahl mit Datumswerten durchzuführen, hat sich diese Methode als sehr effektiv erwiesen:

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

Das ergibt immer einen Dezimalwert. So kann ich das machen:

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

Es gibt kein Problem mit 08 oder 09 auf diese Weise. Wenn Sie% 10 anstelle von% 100 verwenden, erhalten Sie Zehn-Minuten-Bereiche von 0 bis 9. Ich finde auch, dass die folgenden Dezimalwerte ohne führende Nullen angegeben werden:

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

2

Portabel können Sie einen Lead einfach 0aus einer Variablen entfernen . Dadurch bleibt die Variable unverändert, wenn kein Zeilenvorschub vorhanden ist 0.

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

In bash, ksh oder zsh können Sie die zusätzlichen glob-Muster von ksh verwenden, um eine beliebige Anzahl führender 0s zu entfernen . Führen Sie in der Bash shopt -s extglobzuerst aus. Führen Sie in zsh setopt kshglobzuerst aus.

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

1

Im Allgemeinen in der Bash:

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

ergebend

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

Oder anders:

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

Ich bin überrascht, dass das Datum keine geeigneten Formatoptionen hat.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.