Как разобрать выражения времени в оболочке?

359
math

Я хочу иметь скрипт оболочки с параметром, указывающим некоторое время. Существует ли уже существующий способ преобразования временных выражений ala: 1d, 34m, 3s, или 0,456h, или 23ms в, скажем, миллисекунды или часы? Прежде чем я начну кодировать его самостоятельно? В первую очередь я использую Ubuntu, но другие решения для конкретных ОС также были бы интересны.

Это не проблема, что другие инструменты, такие как Perl, Python или AWK могут быть вовлечены.

0

1 ответ на вопрос

2
m0skit0

Вот небольшой грязный пример Perl при преобразовании в миллисекунды строки следующего формата: «Ad Bh Cm Ds», где A, B, C и D - значения для дня, часа, минуты и секунды соответственно. Порядок не имеет значения, но повторение не предусматривается (например, будет обрабатываться только первое появление 'd', другие будут игнорироваться).

#!/usr/bin/perl  use strict;  my @markers = ('d', 'h', 'm', 's'); my @converter = (24*60*60*1000, 60*60*1000, 60*1000, 1000);  my $string = $ARGV[0]; my $total_ms = 0;  while(@markers) { my $cur_mark = shift(@markers); my $cur_convert = shift(@converter); if ($string =~ m/$cur_mark/) { my $pre = $`; $pre =~ m/\b/; $total_ms += $' * $cur_convert;  } }  print("Total miliseconds = $total_ms\n"); 

Примеры использования:

./foo.pl "2m 2s" Total miliseconds = 122000 ./foo.pl "0.5h 0.5s" Total miliseconds = 1800500 
Кстати, это должно работать независимо от того, в какой ОС вы работаете. m0skit0 13 лет назад 0
Если вы используете параллельные массивы, вам, вероятно, нужен хеш. Я бы предложил% markers = ('d' => 24 * 60 * 60 * 1000, 'h' => 60 * 60 * 1000), а затем указывать foreach $ marker (ключи (% markers)) ... dannysauer 13 лет назад 2
Затем вы можете сделать оператор if более похожим на if ($ string = ~ / (\ d +) $ marker \ b /) {$ total + = $ 1 * $ markers {$ marker}} dannysauer 13 лет назад 0