配列は1つの要素のみを返します。

配列は1つの要素のみを返します。

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")または値にスペースまたはシェルワイルドカードパターンを含む変数を使用すると、問題が発生する可能性があります。

関連:

おすすめ記事