2017-02-05 4 views
1

У меня проблема с итерацией по переменной среды, содержащей список шаблонов файлов.Bash для цикла над строкой, содержащей '*'

Пример: "FilePattern = * XML * .log."

Код:

local log_file_pattern=(${FILEPATTERN}) 
for ((i=0; i < ${#log_file_pattern}; i++)) 
do 
    pattern="${log_file_pattern[$i]}" 
    ... some more code ... 
done 

Я всегда получаю:.

  • шаблон = * XML на первой итерации
  • pattern = anaconda-post.log на второй итерации

Как я могу остановить цикл от интерпретации * .log?

+1

Как вы устанавливаете 'FILEPATTERN'? – codeforester

+0

Что вы пытаетесь сделать? дайте нам полную картину, у вас может возникнуть проблема с дизайном. Что вы собираетесь делать, в конце концов, с этими глотками? Обратите внимание, что ваша команда эквивалентна 'for f в $ {FILEPATTERN}; do pattern = $ f; ... еще немного кода ...; done'. Если вы действительно хотите отключить globs, вы можете 'set -f' в начале вашей функции, а затем снова включить globs с помощью' set + f'. –

ответ

1

Я считаю, что FILEPATTERN установлен в *.xml *.log

Проблема в этой строке:

local log_file_pattern=(${FILEPATTERN}) 

Поскольку вы не используете двойные кавычки ${FILEPATTERN}, оболочки подстановка действует. Похоже, в вашем каталоге нет файлов, соответствующих *.xml, тогда как *.log расширяет некоторые имена файлов. Вот почему ваш элемент массива 0 устанавливается в *.xml, а элемент 1 получает значение anaconda-post.log.

Вы можете решить вашу проблему, используя read команду загрузить массив с herestring:

local log_file_pattern 
read -r -a log_file_pattern <<< "$FILEPATTERN" 

который загружает *.xml к элементу 0 и *.log к элементу 1 вашего массива, без универсализации.

+1

Большое спасибо, отлично работает! – blacklabelops

 Смежные вопросы

  • Нет связанных вопросов^_^