2012-11-01 254 views
2

我是新来的bash脚本编写者,并且正在尝试编写脚本来将本地Wordpress数据库与远程数据库同步。那就是:如何将变量传递给bash脚本中的SSH命令

#!/bin/sh 

RUSER=example-admin 
RHOST=ftp.example.com 
RDBUSER=wp_admin 
RDB=wp_db 
RDBHOST=localhost 
RBAK=.backup/latest-remote-db.mssql 

LUSER=root 
LPASS=root 
LHOST=localhost 
LDB=wp_db 
LBAK=.backup/latest-local-db.mssql 

#dump the contents of my local database 
mysqldump -u$LUSER -p$LPASS -h $LHOST $LDB > $LBAK 

#upload my local database to remote 
scp $LBAK [email protected]$RHOST:~/.backup/ 

#login to remote host, backup remote database, delete the remote database then recreate it, restore it with the contents of my local database 
ssh [email protected]$RHOST 'mysqldump -uwp_admin -h localhost wp_db > ~/.backup/latest-remote-db.mssql; mysql -uwp_admin -h localhost -Bse "show databases; drop database wp_db; create database wp_db;"; mysql -uwp_admin -h localhost wp_db < ~/.backup/latest-local-db.mssql;' 

以上优良工程,但我不是满意,最后ssh命令,因为所有的值是硬编码。我更愿意用这样的:

ssh [email protected]$RHOST 'mysqldump -u$RDBUSER -h $RDBHOST $RDB > ~/$RBAK; mysql -u$RDBUSER -h $RDBHOST -Bse "drop database $RDB; create database $RDB;"; mysql -u$RDBUSER -h $RDBHOST $RDB < ~/$LBAK;' 

然而,这显然是行不通的,因为所有的变量都被困在里面的报价,因此没有得到取代。任何人都可以建议一个更好的方式来实现这一目标?我考虑在远端执行一个单独的脚本来处理所有的命令,但是这会让我觉得效率更低。

+1

是否有一个理由使用单引号'''括号,这不扩大bash的变量,而不是双引号的人'“'上的区别详细信息:HTTP:// stackoverflow.com/questions/6697753/difference-between-single-and-double-quotes-in-bash – bbaja42

+0

bbaja42,这就是答案!非常感谢您的帮助。 –

+0

您的下一步应该是接受dogbane的解决方案。 – bbaja42

回答

2

对最外层引号使用双引号,以便扩展变量。在里面使用单引号。

试试这个:

ssh [email protected]$RHOST "mysqldump -u$RDBUSER -h $RDBHOST $RDB > ~/$RBAK; mysql -u$RDBUSER -h $RDBHOST -Bse 'drop database $RDB; create database $RDB;'; mysql -u$RDBUSER -h $RDBHOST $RDB < ~/$LBAK;"