我如何防范“foreach:不匹配”?

dro*_*del 5 shell csh tcsh

我有一个如下所示的 shell 脚本:

foreach dir (i686.* amd64.*)
  # commands
end
Run Code Online (Sandbox Code Playgroud)

此脚本的问题在于,如果没有与这些名称匹配的目录,则会出现以下错误:

"foreach: No match."
Run Code Online (Sandbox Code Playgroud)

防止此错误的优雅方法是什么?

rob*_*off 6

这里有两种方法来处理这个问题。

  1. 设置 shell 的nonomatch变量。这告诉 tcsh 如果模式与任何文件都不匹配,则保持模式不变。因此:

    % set nonomatch=1
    % echo i686.* amd64.*
    i686.* amd64.*
    
    Run Code Online (Sandbox Code Playgroud)

    然后,您需要使命令处理不匹配模式的情况。

  2. 传递一个始终匹配的额外模式。例子:

    % echo i686.* amd64.* /dev/nul[l]
    /dev/null
    
    Run Code Online (Sandbox Code Playgroud)

    然后,您需要使命令忽略与始终匹配模式匹配的文件。这可能比#1 更容易。