我有一个看起来像这样的 shell 脚本:
foreach dir (i686.* amd64.*)
# commands
end
这个脚本的问题是,如果没有与这些名称匹配的目录,那么我会收到以下错误:
"foreach: No match."
防止此错误的优雅方法是什么?
这里有两种处理方法。
设置 shell 的nonomatch
变量。这告诉 tcsh 如果不匹配任何文件,则保持模式不变。因此:
% set nonomatch=1
% echo i686.* amd64.*
i686.* amd64.*
然后,您需要让您的命令处理不匹配模式的情况。
传递一个始终匹配的额外模式。例子:
% echo i686.* amd64.* /dev/nul[l]
/dev/null
然后,您需要让您的命令忽略由始终匹配模式匹配的文件。这可能比#1 更容易。
您可以使用grep
oregrep
而不是文件匹配模式:
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
如果您需要担心包含有趣字符的目录名称,您可能需要使用后缀或添加双引号。