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

Suc*_*ipi 0 bash arguments

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

$ ./myscript.sh echo hello world
# should run 'echo hello world'
Run Code Online (Sandbox Code Playgroud)

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

#!/bin/bash

eval "$@"
Run Code Online (Sandbox Code Playgroud)

这适用于上面的示例:

$ ./myscript.sh echo hello world
# successfully runs `echo hello world`
Run Code Online (Sandbox Code Playgroud)

但是如果任何传递的参数有空格,它就不能正常工作,因为空格被分解成多个参数:

$ ./myscript.sh sh -c 'echo hello world'
# runs `sh -c 'echo' 'hello' 'world'` instead of `sh -c 'echo hello world'`, so nothing is printed
Run Code Online (Sandbox Code Playgroud)

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

Kam*_*ski 6

eval在这种情况下对你有什么好处?用这个:

"$@"
Run Code Online (Sandbox Code Playgroud)

eval "$@"

如果你仍然认为你需要eval那么这个:

eval "${@@Q}"
Run Code Online (Sandbox Code Playgroud)

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

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