LINUX.ORG.RU

История изменений

Исправление vodz, (текущая версия) :

В таком виде не прокатит. у ТС 01,02... а не 1,2...

А это странное условие. Сегодня 01 02 ..., а завтра 001, 002 ...

Вот вам решение, которое считывает по маске [0-9]*.* все файлы, а потом проверяет аргументы, потому работает с любым количеством первых нулей или даже если их нет. Заодно xaizek будет урок, как обойтись без eval и чтения из сопроцесса. (Афигеть, ну как это может в одном месте сочетать, специально чтоли пишут как можно тормознее?)

#!/bin/bash

function tst_range()
{
    local a1=$1 start=${!2} end
    if [ -z "${start##*-*}" ]; then
        end=${start##*-}
        start=${start%%-*}
    else
        end=$start
    fi
    while [ ${a1#0} != $a1 ]; do
        a1=${a1#0}
    done
    return $(($a1 < start || $a1 > end))
}

for f in [0-9]*.* ; do
        for arg; do
                tst_range "${f%%.*}" arg && echo "$f"
        done
done

Без внутреннего цикла с tst можно обойтись, перенеся $@ в функцию tst, но откровенно лень.

Исходная версия vodz, :

В таком виде не прокатит. у ТС 01,02... а не 1,2...

А это странное условие. Сегодня 01 02 ..., а завтра 001, 002 ...

Вот вам решение, которое считывает по маске [0-9]*.* все файлы, а потом проверяет аргументы, потому работает с любым количеством первых нулей или даже если их нет. Заодно xaizek будет урок, как обойтись без eval и чтения из сопроцесса. (Афигеть, ну как это может в одном месте сочетать, специально чтоли пишут как можно тормознее?)

#!/bin/bash

function tst_range()
{
    local a1=$1 start=${!2} end
    if [ -z "${start##*-*}" ]; then
        end=${start##*-}
        start=${start%%-*}
    else
        end=$start
    fi
    while [ ${a1#0} != $a1 ]; do
        a1=${a1#0}
    done
    return $(($a1 < start || $a1 > end))
}

for f in [0-9]*.* ; do
        for arg; do
                tst_range "${f%%.*}" arg && echo "$f"
        done
done