【发布时间】:2011-01-01 14:08:07
【问题描述】:
我尝试执行以下命令:
mysql AMORE -u username -ppassword -h localhost -e "SELECT host FROM amoreconfig"
我将它存储在一个字符串中:
cmd="mysql AMORE -u username -ppassword -h localhost -e\"SELECT host FROM amoreconfig\""
测试一下:
echo $cmd
mysql AMORE -u username -ppassword -h localhost -e"SELECT host FROM amoreconfig"
尝试通过做来执行:
$cmd
我得到了 mysql 的帮助页面:
mysql Ver 14.14 Distrib 5.1.31, for pc-linux-gnu (i686) using readline 5.1
Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL license
Usage: mysql [OPTIONS] [database]
(...)
我想我对引号做了一些明显的错误,但无法找出问题所在。
【问题讨论】:
-
我建议您阅读以下内容:mywiki.wooledge.org/BashFAQ/050
-
@DennisWilliamson - 顶部链接;我特别喜欢这样:“如果你的脑袋太高,以至于你仍然认为你需要在运行它之前写出你将要运行的每个命令” - 我想知道,如何那个作者,会解决一个脚本,你动态地构造一个命令,并明确地想要回显它——为了提示用户“你想运行这个命令吗?”在它运行之前?...
-
@sdaau,取决于使用了常见问题解答中给出的哪种方法。对于一个函数,可以用
declare -f打印它的文本;对于数组(典型的“动态构造”方法):printf '%q ' "${array[@]}"; echo. -
顺便说一句,最佳实践方法是不将您的命令存储为字符串。如果要动态构造它,请使用数组进行。使用
eval,就像这里的最佳答案一样,会带来巨大的安全风险(如果任何内容被参数化,就会面临shell注入攻击)。 -
@DennisWilliamson -- 我喜欢在具有多个阶段的 [big] shell 中为 --dryrun 功能做 if,用户可能会跳过。有意义吗??
标签: bash scripting escaping quotes