数组只返回一个元素

数组只返回一个元素

我正在尝试生成一个脚本,使用 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 通配模式的变量时,您可能会遇到问题。

有关的:

相关内容