我一直在尝试将这个非常有用(原则上)备份自定义为s3脚本。 我真的不是任何真实级别的shell脚本编写者,我无法理解为什么这一行 正在截断变量。
所以,例如
DB=abcdefg
abcdefg_USER=testuser
USER=$(eval echo \$${DB}_USER)
eval语句返回bcdefg_USER,因此截断变量并回显bcdefg_USER而不是abcdefg_USER,因此不评估变量abcdefg_USER
在亚马逊linux ec2实例上运行。
任何人向我解释我错过了什么,我已经尝试过逃避和支撑等,并在过程中回应每个阶段,但无法处理正在发生的事情。< / p>
由于
下面的完整脚本:
## Specify data base schemas to backup and credentials
DATABASES="wp myotherdb"
## Syntax databasename as per above _USER and _PW
wp_USER=username
wp_PW=password
myotherdb_USER=username
myotherdb_PW=password
## Specify directories to backup (it's clever to use relaive paths)
DIRECTORIES="/var/www root etc/cron.daily etc/cron.monthly etc/apache2 etc/mysql etc/php5"
## Initialize some variables
DATE=$(date +%d)
BACKUP_DIRECTORY=/tmp/backups
S3_CMD="s3cmd"
## Specify where the backups should be placed
S3_BUCKET_URL=s3://mybackupbucket/$DATE/
## The script
cd /
mkdir -p $BACKUP_DIRECTORY
rm -rf $BACKUP_DIRECTORY/*
## Backup MySQL:s
for DB in $DATABASES
do
BACKUP_FILE=$BACKUP_DIRECTORY/${DB}.sql
USER=$(eval echo \$${DB}_USER)
PASSWORD=$(eval echo \$${DB}_PW)
/usr/bin/mysqldump -v -u $USER --password=$PASSWORD -h localhost -r $BACKUP_FILE $DB 2>&1
gzip $BACKUP_FILE 2>&1
$S3_CMD put ${BACKUP_FILE}.gz $S3_BUCKET_URL 2>&1
done
## Backup of config directories
for DIR in $DIRECTORIES
do
BACKUP_FILE=$BACKUP_DIRECTORY/$(echo $DIR | sed 's/\//-/g').tgz
tar zcvf ${BACKUP_FILE} $DIR 2>&1
$S3_CMD put ${BACKUP_FILE} $S3_BUCKET_URL 2>&1
done
答案 0 :(得分:3)
假设您正在使用bash,这就是避免eval
:
$ DB=abcdefg
$ abcdefg_USER=testuser
$ tmpvar=${DB}_USER
$ USER=${!tmpvar}
$ echo $USER
testuser
如果你有bash版本4,请考虑使用关联数组:
$ declare -A users
$ users[abcdefg]=testuser
$ echo "${users[$DB]}"
testuser
答案 1 :(得分:0)
您遇到了一些涉及命令替换和echo
的奇怪错误。
使用eval
访问计算变量名时,没有必要通过将echo
包含在进程替换中来使事情复杂化。试试这种模式,它应该可以在任何类似POSIX的shell中运行。
eval FINAL_VALUE=\$${COMPUTED_VAR_PREFIX}_FIXED_SUFFIX
也就是说,只需生成所需变量赋值的源代码,然后eval
代码。