Unix Shell脚本循环只能执行一次
我的shell脚本有问题,应该将备份文件上载到FTP服务器 我创建了一个for循环来执行ftp函数,但不幸的是,它只工作了一次 有人能帮忙吗?先谢谢你Unix Shell脚本循环只能执行一次,shell,unix,ftp,backup,sh,Shell,Unix,Ftp,Backup,Sh,我的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 "-
#!/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
#/垃圾箱/垃圾箱
#FTP备份
#版本:2.0
#更新日期:2014年4月3日
#监控模式
TSCMON=关
echo“-----FTP备份v2-------”
echo“#版本2.0”
回声“-------------------------------------”
doFTP(){
echo“调用doFTP()”
echo“doFTP()->IP=$1->USR->$2->PWD->$3”
声明-a sFILESET=(“${!7}”)
#echo“debuggggggg----------------->${sFILESET[@]}”
echo“#!/bin/sh”>client.ftp
echo“文件计数=$6”
echo“/usr/bin/ftp-inv$1${sFILESET[$i]}”
echo“mput${sFILESET[$i]}”>>client.ftp
完成
回显“再见”>>client.ftp
echo“END_SCRIPT”>>client.ftp
chmod 755 client.ftp
/client.ftp
}
#出口环境
主机=$(主机名)
IP=$(/sbin/ifconfig | grep'inet addr:'| grep-v'127.0.0.1'| cut-d:-f2 | awk'{print$1}'))
DBSID=$ORACLE\U SID
LOCALPATH='/orabackup'
DESTPATH=“${HOST}{IP}/${DBSID}/export”
echo“->导出环境…”
#日期配置
dtoday=$(日期+%Y%m%d)
dyesterday=$(日期--date=“-1天”+%Y%m%d”)
echo“->声明日期配置…”
echo“今天=${dtoday}”
echo“昨天=${DyestDay}”
#文件配置
声明-文件集
echo”-->声明文件配置
#由iPattZ 10Apr2014添加:支持的通配符*#
FILESET[${#FILESET[@]}]=“bfile{dyesterday}.log.gz”
#FILESET[${#FILESET[@]}]=“bfile${dyesterday}.dmp.gz”
echo“FILESET.SIZE->${#FILESET[*]}”
echo“FILESET.VAL->${FILESET[*]}”
#FTP配置
声明-一个FTPHOST
echo”-->声明FTP配置
FTPHOST[${#FTPHOST[@]}]='192.168.1.199;我的用户;我的通行证
FTPHOST[${#FTPHOST[@]}]='192.168.1.200;我的用户;我的通行证
FTPCNT=${FTPHOST[@]}
echo“找到FTP服务器:${FTPCNT}”
#echo“调试:FTP字符串:${FTPHOST[@]}”
为了((i=0;i循环索引i
用于doFTP
和主脚本。第一次调用doFTP
时,i
最终被设置为该调用的$6
值,该值很可能大于FTPCNT
的值,从而使外部循环的退出条件得到满足d下次检查时。只需使用不同的变量作为每个循环的索引。一般来说,/bin/sh
不支持循环或数组的样式。您应该将shebang更改为!#/bin/bash
,或坚持使用符合POSIX的代码。此外,您似乎缺少结束单quote为您分配到FTPHOST
,尽管这会在某个点触发不同的错误,而根本不执行您的循环。+1为way---yyyy比通常的第一篇文章要好。您确实有一些有趣的代码。抱歉,我现在没有时间深入研究。祝您好运!@chepner感谢您的建议,无论如何在我将shebang从“#!/bin/sh”更改为“#!/bin/bash”后,它仍然只是第一次在循环中工作。我只需要将该脚本ftp文件转换为ftp服务器的两个站点。在我尝试调试代码后,我发现迭代被doFTP()函数中的嵌套for循环破坏。在我注释掉以下代码后#((i=0;i>client.ftp#完成脚本作为propery工作,我犯了什么错误?有人能帮我吗?