如何在bash脚本中向SSH命令传递变量

3

我是一个新手,正在尝试编写一个脚本来将本地WordPress数据库与远程数据库同步。以下是我的脚本:

#!/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 $RUSER@$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 $RUSER@$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 $RUSER@$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;'

然而,显然这种方法行不通,因为所有变量都被包含在引号中,所以不能被替换。有没有人能够提供更好的实现方式?我考虑在远程端执行一个单独的脚本来处理所有 mysql 命令,但我认为这样做更加低效。

1
使用不会扩展bash变量的单引号'括号,而不是双引号",有什么原因吗?详见差异:https://dev59.com/Smw15IYBdhLWcg3wT5_2 - bbaja42
bbaja42,那就是答案!非常感谢你的帮助。 - JP Lew
你接下来应该做的是接受dogbane的解决方案。 - bbaja42
1个回答

2

在最外层使用双引号以展开变量。在内部使用单引号。

尝试这样做:

ssh $RUSER@$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;"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接