ftpを使用して一部のファイルをサーバーに転送するスクリプトを生成しようとしていますlftp
。シェルで次のコマンドを実行するとき:
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=[@]}"
要素が1つしかないスクリプトに追加しました。
以前にこの問題が発生したことがあります。これ問題、私はこのソリューションをいくつかのスクリプトで試してみましたが、うまくいきます。私がここで何を見逃しているのでしょうか?
答え1
"${BACKUP_FILE_ARRAY=[@]}"
=
そこにはあまりにもたくさんあります。
また、配列を設定するにはmapfile
シェルモードを使用しないでください。
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"
)または値にスペースまたはシェルワイルドカードパターンを含む変数を使用すると、問題が発生する可能性があります。
関連: