Önde gelen sıfırları 'tarih' çıktısından nasıl kaldırabilirim veya bu ondalık sayıların sekizli yorumunu nasıl önleyebilirim?


37

Bu bende var:

date +"%H hours and %M minutes"

Bunu söylemek için festivali kullanırım .. ama şöyle der: "sıfır dokuz saat" .. "dokuz saat" demesini istiyorum!

ama tarih her zaman bana 09 ver ... bu yüzden bash kolayca 9 olur mu acaba acaba?

karmaşık senaryoda denedim

printf %d 09

ama başarısız olur .. sekizlik değil :(

Herhangi bir fikir?


OP, kabul ettiğin cevabın harika - senin özel durumun için, ama soru başlığına uymuyor.
einpoklum - Monica

@ilkkachu eski başlık, octal-format sayılarının ondalık yorumunu zorlamak için aradığımda bu soruyu bulmak için anahtar rol oynadı.
muru

@muru, evet, orada sekizlikle ilgili notu oraya yapıştırıp yapamayacağımı düşündüm, ama hoş bir ifade bulamadım. Elbette değiştirebilirsin, en azından ne aradığını biliyor musun? Cevaplar ve soru hala esas olarak baştaki sıfırı kaldırmakla ilgili gibi görünüyor.
ilkkachu

Yanıtlar:


49
  • Sizin durumunuzda yapabilirsiniz append ile basitçe devre dışı sıfır doldurma -sonrasında %Tarih biçiminin dizesinde:%-H

    Varsayılan olarak, tarih tuşları, sayısal alanları sıfırlarla doldurur. Aşağıdaki isteğe bağlı bayraklar '%' öğesini takip edebilir:

    • - (kısa çizgi) alanı doldurmaz
    • _ (alt çizgi) boşluklu altlık
    • 0 (sıfır) sıfır içeren ped
    • ^ mümkünse büyük harf kullanın
    • # mümkünse karşı dava kullanın

    Tarih kılavuzuna bakınız

  • Sayıyı farklı bazda, bash olarak yorumlamak istiyorsanız

    • Önde 0 olan sabitler sekizli sayılar olarak yorumlanır.
    • Baştaki bir 0x veya 0X onaltılık gösterir.
    • Aksi halde, sayılar [base #] n biçimini alır, burada taban, aritmetik tabanı temsil eden 2 ile 64 arasında ondalık bir sayıdır ve n, bu tabandaki bir sayıdır

    Yani, bir sayıyı ondalık olarak yorumlamak için 10#n, örneğin;10#09

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

    Bash kılavuzunun Aritmetik Değerlendirme bölümüne bakın .


2
çok detaylı! btw, echo $((011)) $((10#011))çıktı veren başka bir iyi örnek9 11
Kova Gücü

1
Bu, negatif sayılar için işe yaramaz: lat=048 ; latd=${lat#0} ; echo $((latd-1))işe yarar, fakat işe lat=-048 ; latd=${lat#0} ; echo $((latd-1))yaramaz.
Luis A. Florit

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

2

Tarih değerleri ile ondalık olarak karşılaştırma yapmaya çalışıyorsanız, bu yöntemi çok etkili buldum:

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

Bu her zaman bir ondalık değer verir. Böylece bunu yapabilirim:

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

Bu şekilde 08 ya da 09 ile bir sorunum yok. % 100 yerine% 10 kullanılması, 0 ile 9 arasındaki on dakikalık aralıkları verir. Ayrıca, aşağıdakilerin başında sıfır olmadan ondalık değerler verir:

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

2

Taşınabilir bir ucu, 0bir değişkenden kolayca kaldırabilirsiniz . Bu, öncü yoksa değişkeni değiştirmez 0.

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

Bash, ksh veya zsh'da, herhangi bir sayıda satır sayısını kaldırmak için ksh'ın ek glob desenlerini kullanabilirsiniz 0. Bash olarak, shopt -s extglobönce koş . Zsh'de setopt kshglobilk önce çalıştırın .

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

1

Genel olarak bash:

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

sonuçlanan

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

Veya farklı:

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

Tarihin uygun format seçeneklerinin bulunmamasına şaşırdım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.