배열은 하나의 요소만 반환합니다.

배열은 하나의 요소만 반환합니다.

ftp를 사용하여 일부 파일을 서버로 전송하는 스크립트를 생성하려고 합니다 lftp. 쉘에서 다음 명령을 실행할 때:

DBNAME=TESTDB  
ls -t /data*/${DBNAME,,}Backup/$DBNAME.0.db21.DBPART000.`date +%Y%m%d`*

두 가지 경로가 있습니다.

/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

"${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") 또는 값에 공백이나 쉘 와일드카드 패턴이 포함된 변수를 사용할 때 문제가 발생할 수 있습니다.

관련된:

관련 정보