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


0

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

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

Ответы:


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

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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.