如果在此示例中遇到空格,为什么要压缩脚本中断?

时间:2016-12-01 10:51:58

标签: linux bash shell

我需要在多台服务器上执行以下命令:

mysql -h 127.0.0.1 -uroot -psecret mydatabase -e 'SELECT 1;'

所以,我有test1.sh脚本,它回显动态字符串:

#!/bin/bash
echo -n "mysql -h 127.0.0.1 -uroot -psecret mydatabase -e 'SELECT 1'"

执行给定字符串的test2.sh脚本:

#!/bin/bash
CMD=`./test1.sh`
$CMD

如果我执行`./test2.sh,我将看到帮助输出,命令将不会被执行。

如果我删除mysql查询SELECT 1或整个-e param中的空格,然后执行./test2.sh脚本,一切正常。

为什么会这样?你能描述一下这个魔法吗?

我的bash版本是4.2.46。

2 个答案:

答案 0 :(得分:2)

只要您控制并信任来自test1.sh 的命令行,就可以在eval中使用可怕的test2.sh,如下所示:

#!/bin/bash
cmd="$(./test1.sh)"
eval "$cmd"

Why and when should eval use be avoided in shell scripts?

答案 1 :(得分:-2)

您可以像这样尝试 test1.sh 脚本

#!/bin/bash
echo -e "mysql -h 127.0.0.1 -uroot -psecret mydatabase -e"

<强> test2.sh

#!/bin/bash
CMD=$(./test1.sh)
${CMD} "SELECT 1"