我正在编写一个 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
并不完美。