数组仅返回一个元素

黑水晶

我正在尝试生成一个脚本,该脚本使用ftp将某些文件通过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只需使用shell模式:

BACKUP_FILE_ARRAY=( /data*/"${DBNAME,,}"Backup/"$DBNAME.0.db21.DBPART000.$(date +%Y%m%d)"* )

(如果在脚本顶部的某个位置$CURRENTDATE设置了CURRENTDATE=$(date +%Y%m%d)该变量,则使用该变量而不是将命令替换为date,这样,如果脚本恰好在午夜运行,就不会感到困惑)。

ls在一般情况下,使用of的输出会有些问题,因为它使脚本无法使用某些文件名。这也使脚本难以阅读。

要计算与该模式匹配的文件数,请先创建数组,然后使用

BACKUP_FILE_COUNT=${#BACKUP_FILE_ARRAY[@]}

获取其中的元素数量。

要将这个数字添加到COUNTER,请使用标准算术扩展:

COUNTER=$(( COUNTER + BACKUP_FILE_COUNT ))

如果您不知道何时需要对变量的扩展名加上双引号,以及何时不需要这样做,请选择使用双引号(如中所示"$myvar"),否则在使用其值包含空格或shell的变量时可能会遇到问题球形模式。

有关的:

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

for循环仅返回bash脚本中的第一个数组元素

流星模板Blaze如何仅返回数组的第一个元素

从JSON对象数组中仅获取一个元素

mysqli_fetch_assoc仅返回数组的第一个元素

带for循环的Javascript数组,仅返回最后一个元素

Xpath通配符仅返回第一个元素

Vue:Filter返回一个数组,如何获取第一个元素

Javascript数组仅运行函数,该函数在数组的一个元素上返回promise

在def中返回数组的第一个元素

操纵problem的问题:querySelectorAll()仅返回一个元素

JavaScript:使用Reduce()构造一个比较输入数组的函数交集;仅返回相交元素

如何仅返回数组的最后一个元素而不获取所有元素

搜索栏仅返回数据数组中的第一个元素

如何对基于数组的文档进行排序并仅返回结果的第一个元素

HttpWebResponse仅返回页面的一个元素

getElementById仅返回第一个元素的值

Java JComboBox数组仅显示一个元素

仅返回XQuery FLWOR序列中的一个元素

仅返回第一行,其中数组包含一个元素,并且可能省略前面看到的任何元素

展开数组并返回最后一个元素匹配条件

数组函数仅返回第一个值

从ElasticSearch的字符串数组中仅返回一个元素

一个ArrayList包含两个元素,如何仅返回String元素?

反序列化XML,其中根对象是一个数组,仅返回单个元素

仅获取数组猫鼬的最后一个元素

数组列表仅包含一个元素

仅保存C数组的最后一个元素

MongoDB:进行投影以仅返回嵌套到另一个对象的另一个数组中嵌套的数组的第一个元素

展平数组,总和仅返回一个级别