Bash

數組只返回一個元素

  • October 7, 2019

我正在嘗試生成一個腳本,該腳本使用 .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. 只需使用外殼模式:

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

(如果在腳本頂部的某處$CURRENTDATE設置,則使用該變數而不是命令替換 with ,以便腳本在午夜執行時不會混淆)。CURRENTDATE=$(date +%Y%m%d)``date

在一般情況下,使用 的輸出ls有點問題,因為它使腳本無法使用某些文件名。這也使腳本難以閱讀。

要計算與該模式匹配的文件數,首先創建數組,然後使用

BACKUP_FILE_COUNT=${#BACKUP_FILE_ARRAY[@]}

獲取其中的元素數量。

要將此數字添加到COUNTER,請使用標準算術擴展:

COUNTER=$(( COUNTER + BACKUP_FILE_COUNT ))

如果您不知道何時需要為變數的擴展加上雙引號以及何時不需要這樣做,請選擇使用雙引號(如 中"$myvar"),否則在使用值包含空格或 shell 的變數時可能會遇到問題萬用字元模式。

有關的:

引用自:https://unix.stackexchange.com/questions/545459