shell脚本变量被截断 - 为什么

时间:2014-04-17 19:54:58

标签: shell

我一直在尝试将这个非常有用(原则上)备份自定义为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

2 个答案:

答案 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代码。