我正在编写一个 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 而根本不解释其中的空格?
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
.
@Q
Bash 中的这个答案通知并不完美。