Estou tentando gerar um script que ftp alguns arquivos para um servidor usando lftp
. quando eu executo esses comandos no shell:
DBNAME=TESTDB
ls -t /data*/${DBNAME,,}Backup/$DBNAME.0.db21.DBPART000.`date +%Y%m%d`*
eu recebo 2 caminhos:
/data4/testdbBackup/TESTDB.0.db1.DBPART000.20191007010004.001
/data5/testdbBackup/TESTDB.0.db1.DBPART000.20191007010004.002
mas quando eu uso este comando para criar um array e fazer um loop por ele, só recebo o primeiro elemento. aqui está o roteiro:
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
a saída deste script é:
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
nessa parte da mudança de diretórios, espero isso:
lcd /data4/testdbBackup
put TETSTDB.0.db21.DBPART000.20191007010004.001
lcd /data5/testdbBackup
put TETSTDB.0.db21.DBPART000.20191007010004.002
eu também adicionei um echo "${BACKUP_FILE_ARRAY=[@]}"
ao meu script e ele tem apenas um elemento.
eu tive esse problema antes nesta questão e usei a solução em muitos scripts e eles funcionaram perfeitamente. O que estou perdendo aqui?
"${BACKUP_FILE_ARRAY=[@]}"
tem um demais=
nele.Além disso, para definir a matriz, não use
mapfile
. Basta usar o padrão de shell:(se
$CURRENTDATE
estiver definido emCURRENTDATE=$(date +%Y%m%d)
algum lugar na parte superior do script, use essa variável em vez da substituição do comando pordate
, para que o script não fique confuso se for executado à meia-noite).Usar a saída de
ls
é um pouco problemático no caso geral, pois desqualifica o script de trabalhar com alguns nomes de arquivo. Isso também dificulta a leitura do script.Para contar o número de arquivos que correspondem a esse padrão, primeiro crie a matriz e use
para obter o número de elementos nele.
Para adicionar esse número a
COUNTER
, use uma expansão aritmética padrão:Se você não sabe quando precisa usar aspas duplas na expansão de uma variável e quando não é necessário fazê-lo, opte por usar aspas duplas (como em
"$myvar"
), ou provavelmente terá problemas ao usar variáveis cujos valores contenham espaços em branco ou shell padrões globulares.Relacionado: