在bash中用于反引号的有效命令?

时间:2014-05-22 08:08:14

标签: bash shell ubuntu-12.04 backticks

考虑两个命令,

command1="mysql -umyuser -pmypassword -e \"show databases;\";"
command2="cat stackoverflow.txt"

字符串形成如下,

echo ${command1} -> mysql -umyuser -pmypassword -e "show databases;";
echo ${command2} -> cat stackoverflow.txt

我的目标是从变量运行命令并将其结果存储在另一个中。

所以我做的是,

result1=`${command1}`
ERROR 1049 (42000): Unknown database 'databases;";'

,但

result2=`${command2}` 

完美无缺。

使用$()代替反引号时,命令的行为相同。

当直接在反引号而不是变量中运行时,这两个命令都可以正常工作。

为什么会出现这种不同的行为?

1 个答案:

答案 0 :(得分:2)

以下内容:

command1="mysql -umyuser -pmypassword -e \"show databases;\";"
由于分词,

失败了。当你说$command1时,shell会把它解释为:

mysql -umuuser -pmypassword -e '"show' 'databases;";'

因此,传递给-e选项的参数为"show而不是您的想法。

改为使用功能:

mycommand() {
  mysql -umyuser -pmypassword -e "show databases;"
}

在第二种情况下,shell只是读取文件的内容并执行它。因此,它有效。

您可能还想参考手册中的Word Splitting。另请参阅:I'm trying to put a command in a variable, but the complex cases always fail!