如果没有扩展名为.c的文件,bash for循环包括通配符(*.c).我怎么到处走走?

F Y*_*oob 3 unix bash shell scripting for-loop

我在UNIX上使用bash(sparc 10)

for file in $SCPATH/$LIBNAME/*.{gob,c,cpp,h};
do
    ln -s $file;
done;
Run Code Online (Sandbox Code Playgroud)

问题是:如果没有扩展名为'c'的文件,它会将" .c"放在$ file中,而ln -s将创建一个指向' .c' 的链接.这是一个知道问题吗?我怎样才能绕过它(除了显而易见的'如果不是*.c'黑客).

Sie*_*geX 8

你需要在循环之前设置nullglob

shopt -s nullglob
Run Code Online (Sandbox Code Playgroud)

nullglob: 如果设置,bash允许不匹配任何文件的模式(参见上面的Pathname Expansion)扩展为空字符串,而不是自己.

当您完成并想要将其重置为原始行为时,请使用:

shopt -u nullglob
Run Code Online (Sandbox Code Playgroud)

正如Dennis Williamson在其中一条评论中指出的那样.

  • 如果你不需要将任何变量从循环传递到外部,你可以简单地用括号包装它(包括`shopt`调用):`(```)`.然后设置保持在本地内部. (4认同)
  • @FYaqoob:`shopt -u nullglob` (3认同)