La boucle Unix Shell Script ne peut être exécutée qu’une seule fois

J’ai un problème avec mon script shell qui doit être téléchargé sur les serveurs FTP

Je crée une boucle for pour exécuter la fonction ftp mais malheureusement elle ne fonctionne qu’une seule fois.

Quelqu’un peut-il aider? Merci d’avance.

#!/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 <> 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 ${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 Ssortingng : ${FTPHOST[@]}" for ((i=0;i FTP No.$(($i+1)) : Connecting ..." IFS=';' read -aj <<${sFTPIP}" echo " FTPUSR=${sFTPUSR}" #echo "DEBUG sFILECNT=${sFILECNT}" #echo "DEBUG FTPPWD=${sFTPPWD}" doFTP $sFTPIP $sFTPUSR $sFTPPWD $LOCALPATH $DESTPATH $sFILECNT "FILESET[@]" done 

L’indice de boucle i est utilisé à la fois dans doFTP et dans votre script principal. La première fois que doFTP est appelée, i finis par définir ce que $6 représente pour cet appel, ce qui est probablement supérieur à la valeur de FTPCNT , ce qui fait que votre condition de sortie pour la boucle externe sera vérifiée la prochaine fois. Utilisez simplement une variable différente comme index pour chaque boucle.