![배열은 하나의 요소만 반환합니다.](https://linux55.com/image/161840/%EB%B0%B0%EC%97%B4%EC%9D%80%20%ED%95%98%EB%82%98%EC%9D%98%20%EC%9A%94%EC%86%8C%EB%A7%8C%20%EB%B0%98%ED%99%98%ED%95%A9%EB%8B%88%EB%8B%A4..png)
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"
) 또는 값에 공백이나 쉘 와일드카드 패턴이 포함된 변수를 사용할 때 문제가 발생할 수 있습니다.
관련된: