使用 eval 运行 $@ 时如何保留 args 中的空格

使用 eval 运行 $@ 时如何保留 args 中的空格

我正在编写一个 bash 脚本来运行传递给它的所有内容。我希望它像这样工作:

$ ./myscript.sh echo hello world
# should run 'echo hello world'

到目前为止,这是我的脚本:

#!/bin/bash

eval "$@"

这对于上面的例子来说效果很好:

$ ./myscript.sh echo hello world
# successfully runs `echo hello world`

但是,如果传递的任何参数有空格,则它无法正常工作,因为空格会分解为多个参数:

$ ./myscript.sh sh -c 'echo hello world'
# runs `sh -c 'echo' 'hello' 'world'` instead of `sh -c 'echo hello world'`, so nothing is printed

如何将 bash 脚本收到的所有参数传递给 eval 而不解释其中的空格?

答案1

eval在这种情况下,能给你带来什么好处呢?用这个:

"$@"

IE eval "$@"

如果您仍然认为需要,eval那么:

eval "${@@Q}"

${var@Q}使 Bash 引用和/或转义内容,因此在再次解析(这就是所做eval的)之后,它会回到原始状态。${var@Q}如果必须解析内容(例如,您将其传递ssh到无法避免的远程 shell),则很有帮助。如果您可以避免额外的解析,那么就避免。在您的情况下,您可以通过不使用来做到这一点eval

这个答案Bash 中的通知@Q并不完美。

相关内容