LINUX.ORG.RU
ФорумAdmin

Передача параметра скрипту в виде 1-5 7, 9-11

 , ,


1

1

Доброго времени суток всем.

Хочу написать скрипт, который будет копировать файлы из одной директории в другую. Файлы пронумерованы

01.Somename
02.Somename
03.Somename
04.Somename
...
20.Somename

Хочу, что при запуске скрипт спрашивал, какие именно файлы я желаю скопировать, а я отвечал что-то типа 1-5 7, 9-11.

Ткните в простое решение, пожалуйста, если оно есть.

P.S. Если простого решения нет, то буду руками делать, не велика потеря.

★★★★★

Наверное, не самое простое, но всё же:

function expand_range()
{
    if [ -n "${1##*-*}" ]; then
        echo "$1"
    else
        eval "echo {${1/-/..}}"
    fi
}

for arg; do
    while read i; do
        printf "%02d.Somename\n" $i
    done < <( expand_range "$arg" )
done
$ ./script.sh 1-5 7 9-11
01.Somename
02.Somename
03.Somename
04.Somename
05.Somename
07.Somename
09.Somename
10.Somename
11.Somename

xaizek ★★★★★
()

Хочу, что при запуске скрипт спрашивал, какие именно файлы я желаю скопировать, а я отвечал

whiptail --title "Copy files" --checklist \
  "Select files to copy:" 19 78 12 \
  "01. Somefile" "" OFF \
  "02. Somefile" "" OFF \
  "03. Somefile" "" OFF \
  "04. Somefile" "" OFF \
  "05. Somefile" "" OFF \
  "06. Somefile" "" OFF \
  "07. Somefile" "" OFF \
  "08. Somefile" "" OFF \
  "09. Somefile" "" OFF \
  "10. Somefile" "" OFF \
  "11. Somefile" "" OFF \
  "12. Somefile" "" OFF \
  "13. Somefile" "" OFF \
  "14. Somefile" "" OFF \
  "15. Somefile" "" OFF \
  "16. Somefile" "" OFF \
  "17. Somefile" "" OFF \
  "18. Somefile" "" OFF \
  "19. Somefile" "" OFF \
  "20. Somefile" "" OFF \
  2> result.txt

echo "User selected: $(cat result.txt)"
i-rinat ★★★★★
()
Ответ на: комментарий от anc

В таком виде не прокатит. у ТС 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 ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от aquadon

Мне до bash-гуру далеко. Вот придумал вариант проще для случая, когда верхняя граница известна:

function join_by { local IFS="$1"; shift; echo "$@"; }

for i in $(echo {01..99} | cut -d' ' -f"$(join_by , "$@")"); do
    echo $i.Somename
done

xaizek ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.