【问题标题】:Unix Shell Script loop can execute only onceUnix Shell 脚本循环只能执行一次
【发布时间】: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 脚本正在正常工作,我的错误是什么,有人可以帮忙吗?

标签: shell unix ftp backup sh


【解决方案1】:

循环索引i 用于doFTP 和您的主脚本。第一次调用doFTP 时,i 最终被设置为该调用的任何$6,这很可能大于FTPCNT 的值,从而满足外部循环的退出条件下次检查。只需使用不同的变量作为每个循环的索引。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-06
    • 1970-01-01
    • 2011-07-29
    • 2023-04-09
    • 1970-01-01
    • 2013-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多