linux - 如果在此示例中遇到空格,为什么 bash 脚本会中断?

标签 linux bash shell

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

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

所以,我有 test1.sh 脚本,它 echo-es 动态字符串:

#!/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 参数中的空格,然后执行 ./test2.sh 脚本,一切正常。

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

我的 bash 版本是 4.2.46。

最佳答案

只要您控制并信任来自 test1.sh 的命令行,您就可以在 test2 中使用可怕的 eval。 sh 像这样:

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

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

关于linux - 如果在此示例中遇到空格,为什么 bash 脚本会中断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40908706/

相关文章:

linux - Bash 脚本没有扩展我的 $file 变量?

linux - 如何在避免 'Too many arguments' 的同时进行 grep

python - 如何使用 python 终止/重置现有的 tcp 连接?

LINUX tcpdump - UDP数据包监控时关于IPS和端口

linux - 具有多个变量(语句)的循环

android - 通过 shell 从代码调用模拟器上的指纹触摸

c - 相同(几乎)的 ELF header ,但可执行文件不会在彼此的系统上运行

bash - wc 是做什么的?你如何使用它来计算文件中的单词数?

linux - 如何在 shell 脚本中的 SCP 命令中附加变量?

android -/proc/wakelocks 的列是什么意思?