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

0

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

Это не проблема, что могут быть задействованы другие инструменты, такие как perl, python или awk.

math
источник

Ответы:

2

Вот небольшой грязный пример 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
источник
Кстати, это должно работать независимо от того, в какой ОС вы работаете.
m0skit0
2
Если вы используете параллельные массивы, вам, вероятно, нужен хеш. Я бы предложил% markers = ('d' = & gt; 24 * 60 * 60 * 1000, 'h' = & gt; 60 * 60 * 1000), а затем использовать foreach $ marker (ключи (% markers)) ...
dannysauer
Затем вы можете сделать оператор if более похожим на if ($ string = ~ / (\ d +) $ marker \ b /) {$ total + = $ 1 * $ markers {$ marker}}
dannysauer