Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix Shell脚本循环只能执行一次_Shell_Unix_Ftp_Backup_Sh - Fatal编程技术网

Unix Shell脚本循环只能执行一次

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 "-

我的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
#/垃圾箱/垃圾箱
#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工作,我犯了什么错误?有人能帮我吗?