LINUX.ORG.RU
ФорумAdmin

как вывести/обработать каждый символ из множества заданным диапазоном на bash

 ,


0

1

Например: В скрипте я проверяю существование файла. Там же есть переменная $date, которая читает с клавиатуры значение. Часть файлов лежит уже в архивах, а часть нет. Если ввожу конкретную дату, то все гуд. А если ввожу вот так 2016-08-2[1-9], то проверка идет только один раз и по первому значению 2016-08-21 и дальше скрипт не догадывается, что часть файлов еще есть не в архивной папочке.

Не обязательно конкретно этот пример 2016-08-2[1-9].

Как вариант 123[456789] или [1-25] ...

То есть в результате я хочу получить возможность оперировать каждым элементом из заданого множества.

Подскажите пожалуйста. Я уже устал гуглить. Если не в тот раздел написал, прошу прощения (это первый раз когда я написал на каком-либо форуме). Заранее очень благодарен за помощь.

Не читал, но предлагаю 2016-08-2{1..9}. А может лучше что-нибудь поскриптовее взять?

anonymous
()

для превращения [1-9] в список файлов удовлетворяющему условию надо почитать про bash glob expansion.
для обработки этого списка поштучно стоит почитать про циклы.

FILES_GLOB='2016-08-2[1-9].txt'
for file in $FILES_GLOB ; do 
do_something.sh $file
done  

bl ★★★
()
Ответ на: комментарий от Zmicier

Прога имеет 552 строки, не вижу смысла ее выкладывать, да и дело не в ней. Помогите пожалуйста вот в чем: Например можно взять маленький НЕ РАБОТАЮЩИЙ скрипт: #!/bin/bash global=2016-09-0[1-9] for i in $global do echo $i done

Ну и вопрос стоит в том, как мне переписать этот скрипт, что бы я мог вывести каждое значение: 2016-09-01 2016-09-02 2016-09-03 2016-09-04 ...

Решение этого, поможет мне решить вопрос с тем, что бы я в дальнейшем мог оперировать с каждым из значений. Это уже как писал «bl» можно запросто будет сделать циклом.

П.С.: Не ожидал, что так быстро будут ответы. Спасибо за скорость.

nomore25
() автор топика
Ответ на: комментарий от anonymous

Это уже ближе к решению - за это спасибо :)

если записать вот так:

#!/bin/bash
for i in 2016-09-0{1..9}
do
echo "$i"
done

то вывод так как я бы и хотел

2016-09-01
2016-09-02
2016-09-03
2016-09-04
2016-09-05
2016-09-06
2016-09-07
2016-09-08
2016-09-09

Но если я помещаю 2016-09-0{1..9} в переменную, то не работает

В общем вот кусок проги:

echo -n "Enter date: "
read date
chek_road () {
for i in $(ssh "$2".noda.sn ls "$1"/edr/)
do
if [[ "$i" =~ ^.{12,16}"$date".{10,14}$ ]]
then
echo "file NAIDEN"
file="opt"
break
else
file="mnt"
fi
done
}

И в этот кусок кода я хочу впилить еще цикл на перебор переменной $date В нее будет записывать обычный юзер дату и он может записать вот так 2016-09-0[123456].

По этому как бы мне так что бы данный диапазон запихнуть в переменную и что бы можно было(если это возможно) прочитать и с квадратных скобок.

Извините что морочу голову. Спасибо

П.С.:

for f in 2016-09-0[1-9]; do echo «$f»; done - не Работает

nomore25
() автор топика
Ответ на: комментарий от nomore25

Не знаю, я сейчас пробовал вводить всякие герулярки и всё отлично работает, включая [abc]:

echo -n "Enter regex: "
read regex
echo

for f in $(ls -1); do 
    if [[ $f =~ "${regex}" ]];  then
        echo $f
    fi
done
anonymous
()
Ответ на: комментарий от nomore25

Прога имеет 552 строки, не вижу смысла ее выкладывать, да и дело не в ней.

И зачем тогда были нужны все ваши слова из первого письма?

Например можно взять маленький НЕ РАБОТАЮЩИЙ скрипт: #!/bin/bash global=2016-09-0[1-9] for i in $global do echo $i done

УМВР.

$ touch 2016-09-{01..09}
$ glob='2016-09-0[1-9]'
$ for f in $glob; do echo "$f"; done
2016-09-01
2016-09-02
2016-09-03
2016-09-04
2016-09-05
2016-09-06
2016-09-07
2016-09-08
2016-09-09

ЧЯДНТ?

Zmicier ★★★★★
()
Ответ на: комментарий от nomore25

Но если я помещаю 2016-09-0{1..9} в переменную, то не работает

Вас это удивляет? Вы где-то прочитали, что должно?

for f in 2016-09-0[1-9]; do echo "$f"; done — не работает

$ echo $BASH_VERSION
$ set -o xtrace
$ for f in 2016-09-0[1-9]; do echo "$f"; done
Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

Вот сделал так как вы писали, но как видите ничего не получается

[user@elf-nod5 ~]$ echo $BASH_VERSION
4.3.30(1)-release
[user@elf-nod5 ~]$ set -o xtrace
++ printf '\033]0;%s@%s:%s\007' user elf-nod5 /home/user
[user@elf-nod5 ~]$ for f in 2016-09-0[1-9]; do echo "$f"; done
+ for f in '2016-09-0[1-9]'
+ echo '2016-09-0[1-9]'
2016-09-0[1-9]
++ printf '\033]0;%s@%s:%s\007' user elf-nod5 /home/user

[b]
Еще раз что мне нужно:
[/b]

Мне надо вот это 2016-09-0[1-9](или это 2016-09-0[5678]...) запихнуть в переменную, что бы я потом мог сделать так:
#!/bin/bash
variable=2016-09-0[1-9]
for i in $variable
do
echo $i
done

Как этот код переписать так, что бы работало. Для чего мне это нужно? Для того что бы я мог оперировать каждым из значений заданного множества. То есть у меня в последствии там вообще не будет echo ( echo я взял как пример самой простой команды ) Не стоит задача в тупую вывести эти значения.

nomore25
() автор топика
Ответ на: комментарий от nomore25

$ for f in 2016-09-0[1-9]; do echo "$f"; done
+ for f in '2016-09-0[1-9]'

Хм... А то же самое в ГНУ Баше без ваших индивидуальных особенностей (то есть в $ bash --norc)?

Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

Да у него просто нет в текущем каталоге соответствующих этому шаблону файлов, и nullglob не установлен, так что всё так и должно быть.

ABW ★★★★★
()
Ответ на: комментарий от ABW

Да у него просто нет в текущем каталоге соответствующих этому шаблону файлов...

Нет, ну люди, конечно, тупые, но не настолько же. Хотя...

Zmicier ★★★★★
()
Последнее исправление: Zmicier (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.