Bash
數組只返回一個元素
我正在嘗試生成一個腳本,該腳本使用 .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 的變數時可能會遇到問題萬用字元模式。有關的: