как перебрать выбранные расширения файлов в ZSH?

В файле resolv.conf перечислены все доступные DNS-серверы. Пока первый в списке запущен и работает, все запросы будут отправляться на него. Ничего для остальных, если только первый не упал. Итак, если первый DNS-сервер в списке включен и знает ответ, он ответит «Я знаю!», иначе он скажет «Боюсь, я не знаю…». И это все. Вы должны сделать 192.168.1.5 (DNS-сервер сайта 2 )осведомленным обо всех записях сайта 1 и, конечно, -наоборот. Привет

1
07.10.2019, 15:05
1 ответ

Предположим, у вас есть следующие файлы :foo.abc, bar.abc, qux.ghi. В bash тело цикла выполняется четыре раза :с foo.abc, bar.abc,*.def(с литералом*qux.ghi. В zsh с параметрами по умолчанию цикл вообще не выполняется, вместо этого вы получаете ошибку

zsh:1: no matches found: *.def

Чтобы избежать запуска цикла с нерасширенным шаблоном подстановочных знаков и запустить цикл с существующими файлами (, если таковые имеются ), добавьте квалификаторNglob .

for file in *.{abc,def,ghi}(N); do …

Вы также можете использовать оператор|, чтобы иметь один паттерн вместо нескольких паттернов. (Фигурные скобки не являются шаблоном с подстановочными знаками, это просто буквальное расширение строки, которое происходит до анализа подстановочных знаков, т. е. *.{abc,def,ghi}(N)— это просто сокращение для*.abc(N) *.def(N) *.ghi(N))

for file in *.(abc|def|ghi)(N); do …

Обратите внимание, что вам по-прежнему нужен квалификатор Nglob, иначе вы получите сообщение об ошибке, если ни один файл не соответствует.

Вместо использования квалификатора Nglob можно включить параметр null_glob(setopt null_glob). Это часто имеет смысл в сценариях. Обратите внимание, что в bash вам нужно будет активировать аналогичную опцию (shopt -s nullglob), чтобы избежать запуска тела цикла на нерасширенных шаблонах.

4
27.01.2020, 23:22

Теги

Похожие вопросы