当第一个glob失败时,在一行中运行两个for循环

时间:2019-07-11 11:18:49

标签: shell terminal zsh glob

我正在尝试运行此

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 :(得分:0)

您可以在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 option

答案 1 :(得分:0)

由于您只回显了文件名,因此无需循环。

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_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

更新:

依次运行两个循环,但保证每个循环至少运行一次:

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