запустить два цикла for в одной строке, когда первый глобус потерпит неудачу - PullRequest
0 голосов
/ 11 июля 2019

Я пытаюсь запустить это:

for file in a?; do echo $file; done; for file in b?; do echo $file; done

оба цикла запускаются (предназначены), если есть файлы, которые соответствуют a? и b?

Но если нет a? файлов, тогда я получаю эту ошибку

zsh: no matches found: a?

и второй цикл никогда не запускается.

Как я могу всегда запускать оба цикла?

Я понял, что могу поставить a?(N) параметр glob (N), чтобы пропустить ошибку, но я все еще хочу вывод no matches found для первого цикла, если совпадений не найдено.

Ответы [ 2 ]

0 голосов
/ 12 июля 2019

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

a_files=( a?(N) )
if (( ${#a_files} > 0 ))
then
  # We have at least one entry starting with 'a'
  echo $a_files
  echo b?(N)
fi

Предполагая, что вам нужен вложенный цикл, потому что вы хотите что-то обработать с файлами a и b, вы можете сделать a

a_files=( a?(N) )
if (( ${#a_files} > 0 ))
then
  # We have at least one entry starting with 'a'
  for a_file in $a_files
  do
      echo $a_file
      for b_file in b?(N)
      do
         do_something_with $a_file $b_file
      done
  done
fi

UPDATE:

Запуск двух циклов последовательно, но гарантируется, что каждый цикл запускается хотя бы один раз:

a_loop_entered=0
for file in a?(N) .
do
  if [[ $file != . || $a_loop_entered==0 ]]
    a_loop_entered=1
    # Now do your loop body. 
  fi
done
0 голосов
/ 11 июля 2019

Вы можете сделать это в zsh:

unsetopt nomatch    
for f in a?; do [[ -e "$f" ]] && echo "$f" || echo "no matches found"; done

setopt nomatch
for f in b?; do echo "$f"; done

zsh nomatch опция

...