考虑两个命令,
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}`
完美无缺。
使用$()
代替反引号时,命令的行为相同。
当直接在反引号而不是变量中运行时,这两个命令都可以正常工作。
为什么会出现这种不同的行为?
答案 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!。