Bir bash komut dosyasında, bir saati temsil eden bir sayı varsa, hhmms (veya hmms) biçiminde, 10 dakikayı çıkarmanın en iyi yolu nedir?Bash: verilen bir süreden 10 dakika çıkarma
yani 90000 -> 85000
Bir bash komut dosyasında, bir saati temsil eden bir sayı varsa, hhmms (veya hmms) biçiminde, 10 dakikayı çıkarmanın en iyi yolu nedir?Bash: verilen bir süreden 10 dakika çıkarma
yani 90000 -> 85000
Bu biraz zordur. Yapabileceğiniz yani tarihi, genel manipülasyonlara yapabilirsiniz:
date --date '-10 min'
saat-min-saniye belirtme (UTC kullanarak aksi takdirde PM varsaymak gibi görünüyor çünkü):
date --date '11:45:30 UTC -10 min'
tarih dize bölmek için, Aklıma tek yolu genişletme substring edilir:
:a=114530
date --date "${a:0:2}:${a:2:2}:${a:4:2} UTC -10 min"
Ve sadece SSDDSS geri almak istiyorsanız
neden sadece zamanlama zamanını kullanmıyor ve sonra 600'ü kapalı tutmuyor? Eğer bir 5 veya 6 basamaklı sayıyı olduğundan
$ echo "`date +%s` - 600"| bc; date
1284050588
Thu Sep 9 11:53:08 CDT 2010
$ date -d '1970-01-01 UTC 1284050588 seconds' +"%Y-%m-%d %T %z"
2010-09-09 11:43:08 -0500
Cevabınız için teşekkür ederiz. Mesele şu anki zamana göre yapmak zorunda değilim. Bu, betik içine beş veya altı haneli bir sayı olarak geçirilecek keyfi bir zamandır. –
Genellikle, kendi stilinizi/özelliklerinizi vurgulamak ve yayınlarken "$" gibi geleneksel bir istemi kullanmak iyi bir fikirdir. (Bu soruları yanıtlamadan önce PS1 = '\ $' 'ayarlıyorum, böylece kopyalayıp yapıştırabilirim.) –
, sen dize kullanımı yapmadan önce ped öyle olmak zorunda:
$ t=90100
$ while [ ${#t} -lt 6 ]; do t=0$t; done
$ echo $t
090100
$ date +%H%M%S --utc -d"today ${t:0:2}:${t:2:2}:${t:4:2} UTC - 10 minutes"
085100
Not hem --utc ve UTC emin sistem en yapmaları gerekmektedir Saat dilimi sonuçları etkilemez.
Bash olan matematik (yani$((
ve
((
) için, ön sıfır sayısı sekizlik olarak yorumlanmalıdır neden olur. Bununla birlikte, verileriniz, neyse, sayı gibi olmaktan ziyade daha çok string benzeri (özel bir formatla). Yukarıda bir süre kullandım çünkü bir sayı gibi davranıyormuş gibi geliyor ve bu yüzden 12:01 için 100 olabilir.
Bash sürümüm, -d veya - yukarıda kullanıldığı gibi desteklemiyor. Ancak, doğru 0-yastıklı girişi varsayılarak, bu cevap için
$ input_time=130503 # meaning "1:05:03 PM"
# next line calculates epoch seconds for today's date at stated time
$ epoch_seconds=$(date -jf '%H%M%S' $input_time '+%s')
# the 600 matches the OP's "subtract 10 minutes" spec. Note: Still relative to "today"
$ calculated_seconds=$((epoch_seconds - 600)) # bc would work here but $((...)) is builtin
# +%H%M%S formats the result same as input, but you can do what you like here
$ echo $(date -r $calculated_seconds '+%H%M%S')
# output is 125503: Note that the hour rolled back as expected.
Teşekkür çalışmak yok. Yani açıklığa kavuşturmak için ... zaman şimdiki zaman değil ... bu betiğin içine bir parametre olarak beş veya altı basamaklı bir sayı girilir ... bu yaklaşım işe yarar mı? –
@RogerMoore evet, bu yüzden kullanıyorum --date. "Ss: dd: ss UTC" şeklinde yazılmalıdır, çünkü aksi halde yanlış yorumlanamaz, ancak amacınız için işe yaramış gibi görünüyor. Ss: dd: s şeklinde bir zamanda geçtiğinizde ne yapacağınızdan emin değilim, en iyi testi, gece yarısı ve öğle saatlerinde. – wds