我正在尝试生成一个脚本,该脚本使用 .ftp 将一些文件传输到服务器lftp
。当我在 shell 中运行这些命令时:
DBNAME=TESTDB
ls -t /data*/${DBNAME,,}Backup/$DBNAME.0.db21.DBPART000.`date +%Y%m%d`*
我有 2 条路径:
/data4/testdbBackup/TESTDB.0.db1.DBPART000.20191007010004.001
/data5/testdbBackup/TESTDB.0.db1.DBPART000.20191007010004.002
但是当我使用这个命令创建一个数组并循环遍历它时,我只得到第一个元素。这是脚本:
echo "lftp -u $FTPUSER,$FTPPASSWD $FTPSRV <<end_script
mkdir BackUp
cd BackUp
mkdir $CURRENTDATE
cd $CURRENTDATE
mkdir $IP
cd $IP " >> $FTPFILES
for DBNAME in "${DBNAME_ARRAY[@]}"
do
BACKUP_FILE_COUNT=$(ls -t /data*/${DBNAME,,}Backup/$DBNAME.0.db21.DBPART000.`date +%Y%m%d`*|wc -l)
COUNTER=($(echo $COUNTER + $BACKUP_FILE_COUNT | bc))
mapfile -t BACKUP_FILE_ARRAY < <(ls -t /data*/${DBNAME,,}Backup/$DBNAME.0.db21.DBPART000.`date +%Y%m%d`*)
for BACKUP_FILE in "${BACKUP_FILE_ARRAY=[@]}"
do
echo "lcd $(dirname $BACKUP_FILE)" >> $FTPFILES
echo "put $(basename $BACKUP_FILE)" >> $FTPFILES
done
done
echo "quit
end_script
exit 0 " >> $FTPFILES
该脚本的输出是:
lftp -u someuser,somepassword 1.1.1.1 <<end_script
mkdir BackUp
cd BackUp
mkdir 19-10-07
cd 19-10-07
mkdir 192.168.22.22
cd 192.168.22.22
lcd /data4/testdbBackup
put TETSTDB.0.db21.DBPART000.20191007010004.001
quit
end_script
exit 0
在更改目录的那一部分中,我希望这样:
lcd /data4/testdbBackup
put TETSTDB.0.db21.DBPART000.20191007010004.001
lcd /data5/testdbBackup
put TETSTDB.0.db21.DBPART000.20191007010004.002
我还在echo "${BACKUP_FILE_ARRAY=[@]}"
我的脚本中添加了一个,它只有一个元素。
我之前在这个问题中遇到过这个问题,我在许多脚本中使用了该解决方案,并且它们运行良好。我在这里想念什么?
"${BACKUP_FILE_ARRAY=[@]}"
里面有太多了=
。另外,要设置数组,不要使用
mapfile
. 只需使用外壳模式:(如果在脚本顶部的某处
$CURRENTDATE
设置,则使用该变量而不是命令替换 with ,以便脚本在午夜运行时不会混淆)。CURRENTDATE=$(date +%Y%m%d)
date
在一般情况下,使用 的输出
ls
有点问题,因为它使脚本无法使用某些文件名。这也使脚本难以阅读。要计算与该模式匹配的文件数,首先创建数组,然后使用
获取其中的元素数量。
要将此数字添加到
COUNTER
,请使用标准算术扩展:如果您不知道何时需要为变量的扩展加上双引号以及何时不需要这样做,请选择使用双引号(如 中
"$myvar"
),否则在使用值包含空格或 shell 的变量时可能会遇到问题通配符模式。有关的: