当使用通配符传递文件名时,如何使 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