【发布时间】:2014-06-01 21:36:39
【问题描述】:
我的 shell 脚本有问题,应该将备份文件上传到 FTP 服务器
我创建了一个 for 循环来执行 ftp 函数,但不幸的是它只能工作一次。
谁能帮忙?提前致谢。
#!/bin/sh
# FTP Backup
# Version : 2.0
# Updated : 03/04/2014
#MONITOR MODE
TSCMON=off
echo "-------- FTP BACKUP v2 --------"
echo "# version 2.0 #"
echo "-------------------------------"
doFTP () {
echo "Invoking doFTP()"
echo "doFTP()->IP=$1->USR->$2->PWD->$3"
declare -a sFILESET=("${!7}")
#echo "DEBUGGGGGGGGG -------------------> ${sFILESET[@]}"
echo "#!/bin/sh" > client.ftp
echo " FILECOUNT= $6"
echo "/usr/bin/ftp -inv $1 << END_SCRIPT" >> client.ftp
echo "quote USER $2" >> client.ftp
echo "quote PASS $3" >> client.ftp
echo "lcd $4" >> client.ftp
echo "mkdir $5" >> client.ftp
echo "cd $5" >> client.ftp
for ((i=0;i<$6;i++)); do
#echo "DEBUG i=$i"
echo " UPLOADING FILE --> ${sFILESET[$i]}"
echo "mput ${sFILESET[$i]}" >> client.ftp
done
echo "bye" >> client.ftp
echo "END_SCRIPT" >> client.ftp
chmod 755 client.ftp
./client.ftp
}
#Export Environment
HOST=$(hostname)
IP=$(/sbin/ifconfig | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}')
DBSID=$ORACLE_SID
LOCALPATH='/orabackup'
DESTPATH="${HOST}_${IP}/${DBSID}/export"
echo "--> Exporting Environment ..."
#DATE CONFIGURATION
dtoday=$(date +"%Y%m%d")
dyesterday=$(date --date="-1 day" +"%Y%m%d")
echo "--> Declaring DATE CONFIGURATION ..."
echo " TODAY = ${dtoday}"
echo " YESTERDAY = ${dyesterday}"
#FILE CONFIGURATION
declare -a FILESET
echo "--> Declaring FILE CONFIGURATION ..."
# Added by iPattZ 10Apr2014 : Supported Wildcard *#
FILESET[${#FILESET[@]}]="bfile_${dyesterday}.log.gz"
#FILESET[${#FILESET[@]}]="bfile_${dyesterday}.dmp.gz"
echo " FILESET.SIZE-> ${#FILESET[*]}"
echo " FILESET.VAL-> ${FILESET[*]}"
#FTP CONFIGURATION
declare -a FTPHOST
echo "--> Declaring FTP CONFIGURATION ..."
FTPHOST[${#FTPHOST[@]}]='192.168.1.199;myuser;mypass
FTPHOST[${#FTPHOST[@]}]='192.168.1.200;myuser;mypass
FTPCNT=${#FTPHOST[@]}
echo " Found FTP Server : ${FTPCNT}"
#echo "DEBUG : FTP String : ${FTPHOST[@]}"
for ((i=0;i<FTPCNT;i++)); do
echo "--> FTP No.$(($i+1)) : Connecting ..."
IFS=';' read -a j <<< "${FTPHOST[i]}"
sFTPIP=${j[0]}
sFTPUSR=${j[1]}
sFTPPWD=${j[2]}
sFILECNT=${#FILESET[*]}
echo " FTPIP->${sFTPIP}"
echo " FTPUSR=${sFTPUSR}"
#echo "DEBUG sFILECNT=${sFILECNT}"
#echo "DEBUG FTPPWD=${sFTPPWD}"
doFTP $sFTPIP $sFTPUSR $sFTPPWD $LOCALPATH $DESTPATH $sFILECNT "FILESET[@]"
done
【问题讨论】:
-
一般来说,
/bin/sh不支持这种风格的for循环或数组。您应该将 shebang 更改为!#/bin/bash,或坚持使用符合 POSIX 的代码。 -
此外,您似乎错过了分配给
FTPHOST的单引号,尽管这应该只是在某些时候触发不同的错误,而根本不执行您的循环。 -
+1 for way---yyyy 比通常的第一篇文章好。你实际上有一些有趣的代码。抱歉,我现在没有时间深入研究。祝你好运!
-
@chepner 感谢您的建议,在我将 shebang 从 "#!/bin/sh" 更改为 "#!/bin/bash" 之后,它仍然只在循环中第一次工作。我只需要将该脚本 ftp 文件放入 FTP 服务器的 2 个站点。
-
在我尝试调试我的代码后,我发现迭代被 doFTP() 函数中的嵌套 for 循环破坏了。在我注释掉以下代码后 #for ((i=0;i ${sFILESET[$i]}" # echo "mput ${sFILESET[$i]}" >> client.ftp #done 脚本正在正常工作,我的错误是什么,有人可以帮忙吗?