使用通配符处理包含传递给 Bash 函数的空格的文件名

使用通配符处理包含传递给 Bash 函数的空格的文件名

当使用通配符传递文件名时,如何使 Bash 函数正确处理包含空格的文件名?

$ touch a "a b" b
$ ls -1 *
a
a b
b

$ function foo { ls -1 $*; }
$ foo *
a
a
b
c

我想定义一个函数 foo ,它返回ls -1 *与执行为 时相同的结果foo *。我尝试$@代替,$*但它也不起作用。

答案1

考虑到它的调用方式,我不确定你的函数应该做什么。但这是一个可能的解决方案。

foo () { ls -1 "$@"; }

该函数应该使用ls -1传递给命令的函数位置参数来调用。它是如何工作的?

$ touch a "a b" b
$ ls -1 .
a
a b
b
$ foo .
a
a b
b

这也有效:

$ foo *
a
a b
b

但你需要知道foo .和之间的区别foo *。前者.作为参数传递给函数foo,然后在内部将相同的参数传递给ls -1.foo *情况有所不同,因为扩展*为函数的参数列表foo,然后需要在内部处理参数。这是在我的函数 with 中完成的"$@",它扩展了位置参数以处理空格。如果省略周围的引用$@,您最终会得到以下结果:

$ goo () { ls -1 $@; }
$ goo .
a
a b
b
$ goo *
a
a
b
b

"$*"最后,可以分析一下和“$@”的区别。

$ hoo () { ls -1 "$*"; }
$ hoo .
a
a b
b
$ hoo *
ls: cannot access 'a a b b': No such file or directory

“$*”在这里肯定不是正确的。

$ foo . .
.:
a
a b
b

.:
a
a b
b
$ hoo . .
ls: cannot access '. .': No such file or directory

相关内容