我正在编写一个 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.
@QBash 中的这个答案通知并不完美。