Как предотвратить расширение имени файла для цикла в bash - PullRequest
4 голосов
/ 25 февраля 2011

В цикле for, подобном этому,

for i in `cat *.input`; do
    echo "$i"
done

, если один из входных файлов содержит записи типа *a, он будет и давать имена файлов, оканчивающиеся на «а».

Есть ли простой способ предотвратить это расширение имени файла?

Из-за использования нескольких файлов глобализация (set -o noglob) не является хороший вариант. Я также должен быть в состоянии отфильтровать вывод cat в экранировать специальные символы, но

for i in `cat *.input | sed 's/*/\\*'`
    ...

все еще вызывает расширение *a, тогда как

for i in `cat *.input | sed 's/*/\\\\*'`
    ...

дает мне \*a (включая обратную косую черту). [Я думаю, это другое вопрос хотя]

Ответы [ 2 ]

4 голосов
/ 25 февраля 2011

Это cat содержимого всех файлов и перебирает строки результата:

while read -r i
do
    echo "$i"
done < <(cat *.input)

Если файлы содержат символов-глобусов, они не будут расширены. Эти ключи не должны использовать for и заключать в кавычки вашу переменную.

В оболочках, полученных из Bourne, которые не поддерживают подстановку процессов, это эквивалентно:

cat *.input | while read -r i
do
    echo "$i"
done

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

0 голосов
/ 25 февраля 2011

Для вашего примера простой cat *.input сделает то же самое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...