![数组只返回一个元素](https://linux22.com/image/161840/%E6%95%B0%E7%BB%84%E5%8F%AA%E8%BF%94%E5%9B%9E%E4%B8%80%E4%B8%AA%E5%85%83%E7%B4%A0.png)
我正在尝试生成一个脚本,使用 ftp 将一些文件传输到服务器lftp
。当我在 shell 中运行这些命令时:
DBNAME=TESTDB
ls -t /data*/${DBNAME,,}Backup/$DBNAME.0.db21.DBPART000.`date +%Y%m%d`*
我有两条路径:
/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=[@]}"
我的脚本中添加了 a ,它只有一个元素。
我以前遇到过这个问题这问题,我在许多脚本中使用了该解决方案,并且它们运行得很好。我在这里缺少什么?
答案1
"${BACKUP_FILE_ARRAY=[@]}"
=
里面有太多了。
另外,要设置数组,请勿使用mapfile
.只需使用 shell 模式:
BACKUP_FILE_ARRAY=( /data*/"${DBNAME,,}"Backup/"$DBNAME.0.db21.DBPART000.$(date +%Y%m%d)"* )
(如果在脚本顶部的某个位置$CURRENTDATE
设置了,则使用该变量而不是用 替换命令,这样如果脚本碰巧在午夜运行,则脚本不会感到困惑)。CURRENTDATE=$(date +%Y%m%d)
date
在一般情况下,使用 的输出ls
有点问题,因为它使脚本无法处理某些文件名。这也使得剧本难以阅读。
要计算与该模式匹配的文件数,请首先创建数组,然后使用
BACKUP_FILE_COUNT=${#BACKUP_FILE_ARRAY[@]}
获取其中元素的数量。
要将这个数字添加到COUNTER
,请使用标准算术展开式:
COUNTER=$(( COUNTER + BACKUP_FILE_COUNT ))
如果您不知道何时需要双引号变量的扩展以及何时不需要这样做,选择使用双引号(如"$myvar"
),或者在使用值包含空格或 shell 通配模式的变量时,您可能会遇到问题。
有关的: