Jak usunąć zera wiodące z wyjścia „data” lub uniknąć interpretacji ósemkowej takich liczb dziesiętnych?

37

Mam to:

date +"%H hours and %M minutes"

Używam festiwalu, żeby to powiedzieć… ale brzmi: „zero dziewięciu godzin” .. Chcę, żeby powiedział „dziewięć godzin”!

ale data zawsze daje mi 09 ... więc zastanawiam się, czy bash może sprawić, że stanie się to tylko 9?

w złożonym skrypcie, który próbowałem

printf %d 09

ale to się nie udaje ... nie ósemkowe :(

dowolny pomysł?

Wodnik Moc
źródło
OP, Twoja zaakceptowana odpowiedź jest świetna - w twoim konkretnym przypadku, ale nie pasuje do tytułu pytania.
einpoklum
@ilkkachu stary tytuł był kluczem do znalezienia tego pytania, szukając wymuszania interpretacji dziesiętnej liczb w formacie ósemkowym.
muru
@muru, tak, pomyślałem, że mogę tam napisać o ósemce, ale nie wymyśliłem fajnego frazowania. Oczywiście możesz to zmienić, przynajmniej wiesz, czego szukałeś? Odpowiedzi i pytania nadal wydają się głównie dotyczyć usunięcia wiodącego zera.
ilkkachu

Odpowiedzi:

49
  • W twoim przypadku możesz po prostu wyłączyć wypełnianie zerami, dołączając -po %w ciągu formatu daty:%-H

    Domyślnie data uzupełnia pola numeryczne zerami. Następujące opcjonalne flagi mogą występować po „%”:

    • - (łącznik) nie wypełniaj pola
    • _ (podkreślenie) podkładka ze spacjami
    • 0 (zero) pad z zerami
    • ^ w miarę możliwości używaj wielkich liter
    • # w miarę możliwości użyj przeciwnego przypadku

    Patrz instrukcja daty

  • Jeśli chcesz interpretować liczbę w innej bazie, w bash

    • Stałe z wiodącym 0 są interpretowane jako liczby ósemkowe.
    • Początkowe 0x lub 0X oznacza liczbę szesnastkową.
    • W przeciwnym razie liczby przyjmują postać [podstawa #] n, gdzie podstawa jest liczbą dziesiętną między 2 a 64 reprezentującą podstawę arytmetyczną, a n jest liczbą w tej podstawie

    Aby zinterpretować liczbę jako dziesiętną, użyj 10#nformularza, np.10#09

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

    Zobacz sekcję Oceny arytmetycznej podręcznika bash.

LiuYan 刘 研
źródło
2
dzięki, bardzo szczegółowe! btw, echo $((011)) $((10#011))to kolejny dobry przykład, który wyprowadza9 11
Wodnik Moc
1
To nie działa dla liczb ujemnych: lat=048 ; latd=${lat#0} ; echo $((latd-1))działa, ale lat=-048 ; latd=${lat#0} ; echo $((latd-1))nie działa.
Luis A. Florit
plus=$((10#01))
Dr Beco
2

Jeśli próbujesz dokonywać porównań dziesiętnych z wartościami daty, ta metoda okazała się bardzo skuteczna:

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

To zawsze daje wartość dziesiętną. Więc mogę to zrobić:

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

W ten sposób nie ma problemu z 08 lub 09. Użycie% 10 zamiast% 100 daje dziesięciominutowe zakresy od 0 do 9. Znalazłem również następujące wartości dziesiętne, bez wiodących zer:

echo "$((10#$(date +%M)))"
Dickster
źródło
2

Przenośnie możesz łatwo usunąć wiodącą 0zmienną. Pozostawia to zmienną niezmienioną, jeśli nie ma wiodącego 0.

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

W bash, ksh lub zsh możesz użyć dodatkowych wzorców globu ksh, aby usunąć dowolną liczbę wiodących 0s. W bash biegnij shopt -s extglobpierwszy. W Zsh, uruchom setopt kshglobpierwszy.

eval $(date +"h=%H m=%M")
h=${h#+(0)}
m=${m#+(0)}
say "$h hours and $m minutes"
Gilles „SO- przestań być zły”
źródło
1

Ogólnie rzecz biorąc w bash:

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

powodując

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

Lub inny:

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

Dziwi mnie, że data nie ma odpowiednich opcji formatu.

Hauke ​​Laging
źródło