5

我有一个看起来像这样的 shell 脚本:

foreach dir (i686.* amd64.*)
  # commands
end

这个脚本的问题是,如果没有与这些名称匹配的目录,那么我会收到以下错误:

"foreach: No match."

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

4

2 回答 2

4

这里有两种处理方法。

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

    % set nonomatch=1
    % echo i686.* amd64.*
    i686.* amd64.*
    

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

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

    % echo i686.* amd64.* /dev/nul[l]
    /dev/null
    

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

于 2013-08-20T17:59:47.820 回答
3

您可以使用greporegrep而不是文件匹配模式:

foreach dir ( `ls | egrep '^(i686\|amd64)\.'` )
    # commands
end

如果没有文件匹配,该ls | egrep ...命令根本不会产生任何输出,并且循环体将不会执行。

给定 name dir,您可能想要添加一个测试,任何匹配的文件名实际上是一个目录。

一个更丑的选择是临时创建一个匹配的文件:

tmp=i686.$$
mkdir $tmp
foreach dir (i686.* amd64.*)
    if ($dir != $tmp) then
        # commands
    endif
end
rm $tmp

我不一定推荐这个。

:q如果您需要担心包含有趣字符的目录名称,您可能需要使用后缀或添加双引号。

于 2013-08-20T19:07:35.300 回答