2012-10-26 5 views
-1

아래 스크립트는 sftp를 통해 원격 위치로 파일을 푸시하는 것입니다. 코드 아래에 많은 문제를 썼습니다.하지만 여전히 문제를 겪고 있습니다. 문제점을 해결하도록 안내해주십시오. Sh와 작동하지 않습니다. .it는 ksh에서만 작동합니다.유닉스 셸 스크립트 오류

#test script 
#------------------------------------------------------------------- 
#!/bin/sh 
#------------------------------------------------------------------------ 
# sftp_file_uploads.sh 
#------------------------------------------------------------------------ 
export REMOTE_SERVER_PROD='192.168.0.1' 
export REMOTE_SERVER_FAILOVER='192.168.0.2' 
export SFTP_PORT='0001' 
export SOURCE_FUNCTIONAL_ID='testusr' 
export SOURCE_FILE_DIRECTORY='/var/temp/files/' 
export SOURCE_ARCHIVE_DIRECTORY='/var/temp/files/archive' 
export DATE_FORMAT=`date "+%Y%m%d"` 
export LOG_DIRECTORY='/var/temp/logs' 
export DESTINATION_FILE_DIRECTORY='/dest' 
export LOG_FILE='$LOG_DIRECTORY/test_$DATE_FORMAT.log' 
export SFTP_BATCH_FILE='/var/tmp/SFTP_BATCH_FILE' 
#------------------------------------------------------------------------ 
# Find if the files are available at the source directory. 
#------------------------------------------------------------------------ 
cd $SOURCE_FILE_DIRECTORY 
export FILE_TO_UPLOAD_TESTD=`ls -lrt TESTD$DATE_FORMAT.csv | awk '/TESTD/{ f=$NF };END{ print f }'` 
export FILE_TO_UPLOAD_TESTDF=`ls -lrt TESTDF$DATE_FORMAT.csv | awk '/TESTDF/{ f=$NF };END{ print f }'` 
#------------------------------------------------------------------------ 
# Try 2 times and Sleep for 5 mins if either of the files is not present 
#------------------------------------------------------------------------ 
counter=0 
flag_file_found_TESTD=0 
flag_file_found_TESTDF=0 
while [ $counter –lt 2 ] 
do 
#--------------------------- 
# Check TESTD file arrived 
#--------------------------- 
if [ -z $FILE_TO_UPLOAD_TESTD ] then 
     echo “No TESTD file to transfer. Sleeping for 5 mins” >> $LOG_FILE 
sleep 300 
else 
echo “TESTD file found to transfer.” >> $LOG_FILE 
flag_file_found_TESTD=1 
fi 
#--------------------------- 
# Check TESTDF file arrived 
#--------------------------- 
if [ -z $FILE_TO_UPLOAD_TESTDF ] then 
     echo “No TESTDF file to transfer. Sleeping for 5 mins” >> $LOG_FILE 
sleep 300 
else 
echo “TESTDF file found to transfer.” >> $LOG_FILE 
flag_file_found_TESTDF =1 
fi 
if [[ flag_file_found_TESTD == 1 && 
     flag_file_found_TESTDF == 1 ]] then 
echo “Both files are found.” >> $LOG_FILE 
break 
else 

echo “At least one of the files is not found. Retrying now.” >> $LOG_FILE 
fi 
counter=`expr $counter + 1` 
done 
if [[ flag_file_found_TESTD == 1 && 
     flag_file_found_TESTDF == 1 ]] then 
echo “Both files are found.” 
break 
else 
if [ flag_file_found_TESTD == 0 ] then 
    echo “test file is not found and two attempts completed. Cannot transfer the file for today.” >> $LOG_FILE 
fi 

if [flag_file_found_TESTDF == 0 ] then 
echo “test1 file is not found and two attempts completed. Cannot transfer the file for today.” >> $LOG_FILE 
fi 
fi 
#------------------------------------------------------------------------ 
# Create sftp script 
#------------------------------------------------------------------------ 
rm -f $SFTP_BATCH_FILE 
echo "lcd $SOURCE_FILE_DIRECTORY " > $SFTP_BATCH_FILE 
echo "cd $DESTINATION_FILE_DIRECTORY " >> $SFTP_BATCH_FILE 
if [ -z $FILE_TO_UPLOAD_TESTD ] then 
echo "put $FILE_TO_UPLOAD_TESTD " >> $SFTP_BATCH_FILE 
fi 
if [ -z $FILE_TO_UPLOAD_TESTDF ] then 
echo "put $FILE_TO_UPLOAD_TESTDF " >> $SFTP_BATCH_FILE 
fi 
echo "bye" >> $SFTP_BATCH_FILE 

#------------------------------------------------------------------------ 
# Do sftp 
#------------------------------------------------------------------------ 
echo " Before SFTP " >> $LOG_FILE 
if [[ -z $ FILE_TO_UPLOAD && -z $ FILE_TO_UPLOAD1 ]] then 
echo “No files to transfer” >> $LOG_FILE 
     mv $LOG_FILE $LOG_DIRECTORY 
exit 1 
else 
echo “Attempting to connect to Remote Server $REMOTE_SERVER_PROD” >> $LOG_FILE 
/usr/bin/sftp –v -oPort=$SFTP_PORT -b $SFTP_BATCH_FILE [email protected]$REMOTE_SERVER_PROD >> $LOG_FILE 2 >> $LOG_FILE 
fi 
result=$? 
errorConnectToProd=0 
if [ $result -eq 0 ] 
then 
    echo "SFTP completed successfully to Prod Remote Server" >> $LOG_FILE 
else 
    errorConnectToProd=1 
    if [[ $result -eq 4 || $result -eq 5 ]] 
    echo "FAILED to connect to Server. " >> $LOG_FILE 

    else 
echo "FAILED to SFTP to Remote Server. " >> $LOG_FILE 
    fi 
fi 
if [ errorConnectToProd == 1 ] then 
echo “Attempting to connect to FAILOVER Remote Server $REMOTE_SERVER_FAILOVER” >> $LOG_FILE 
/usr/bin/sftp –v -oPort=$SFTP_PORT -b $SFTP_BATCH_FILE [email protected]$REMOTE_SERVER_FAILOVER >> $LOG_FILE 2 >> $LOG_FILE 
fi 
result=$? 
if [ $result -eq 0 ] 
then 
    echo "SFTP completed successfully to Failover Remote Server" >> $LOG_FILE 
else 
    echo "FAILED to SFTP to Failover Remote Server. " >> $LOG_FILE 
    mv $LOG_FILE $LOG_DIRECTORY 
    exit 1 
    fi 
fi 
cd $SOURCE_FILE_DIRECTORY 
mv $FILE_TO_UPLOAD_TESTD $SOURCE_ARCHIVE_DIRECTORY 
echo “Moved $FILE_TO_UPLOAD_TESTD to archive direcotry.” >> $LOG_FILE 
mv $FILE_TO_UPLOAD_TESTDF $SOURCE_ARCHIVE_DIRECTORY 
echo “Moved $FILE_TO_UPLOAD_TESTDF to archive direcotry.” >> $LOG_FILE 

rm -f $SFTP_BATCH_FILE 
echo “Deleted the SFTP Batch file.” >> $LOG_FILE 
echo “Upload completed.” >> $LOG_FILE 
mv $LOG_FILE $LOG_DIRECTORY 
exit 0 

는 오류 아래 방법 :

test.ksh[41]: $LOG_DIRECTORY/test_$DATE_FORMAT.log: cannot create 

test.ksh[55]: $LOG_DIRECTORY/test_$DATE_FORMAT.log: cannot create 

test.ksh[56]: flag_file_found_TESTDF: not found 

test.ksh[65]: $LOG_DIRECTORY/test_$DATE_FORMAT.log: cannot create 

test.ksh[41]: $LOG_DIRECTORY/test_$DATE_FORMAT.log: cannot create 

test.ksh[55]: $LOG_DIRECTORY/test_$DATE_FORMAT.log: cannot create 

test.ksh[56]: flag_file_found_TESTNDF: not found 

test.ksh[65]: $LOG_DIRECTORY/test_$DATE_FORMAT.log: cannot create 

test.ksh[79]: [flag_file_found_TESTDF: not found 

rm: /var/tmp/SFTP_BATCH_FILE is a directory 

test.ksh[89]: /var/tmp/SFTP_BATCH_FILE: cannot create 

test.ksh[90]: /var/tmp/SFTP_BATCH_FILE: cannot create 

test.ksh[97]: B: not found 

test.ksh[98]: B: not found 

test.ksh[99]: B: not found 

test.ksh[100]: B: not found 

test.ksh[101]: B: not found 

test.ksh[102]: B: not found 

test.ksh[106]: /var/tmp/SFTP_BATCH_FILE: cannot create 

test.ksh[113]: $LOG_DIRECTORY/test_$DATE_FORMAT.log: cannot create 

test.ksh[114]: syntax error at line 114 : `FILE_TO_UPLOAD' unexpected 

감사합니다,

차이

에게
+3

너무 많은 코드! – alestanis

+0

'$ LOG_DIRECTORY'의 값은 어디에 할당되어 있습니까? –

+0

@ alestanis : 동의합니다. 그러나 로깅, 보관 등과 같은 모든 시나리오를 다룹니다. – user1726550

답변

4

을이 줄은 잘못된 것입니다 :

export LOG_FILE='$LOG_DIRECTORY/test_$DATE_FORMAT.log' 

그것은 큰 따옴표를 사용해야 있도록 변수들 L은 확장 :

export LOG_FILE="$LOG_DIRECTORY/test_$DATE_FORMAT.log" 

또 다른 오류 :

if [flag_file_found_TESTDF == 0 ] then 

[ 후 공간이 필요합니다. [은 명령어 (test의 동의어 임)이며 모든 명령어는 인수와 공백으로 구분됩니다.

/var/tmp/SFTP_BATCH_FILE이 (가) 이미 존재하고 디렉토리이기 때문에 "Create sftp script"라는 섹션 전체가 실패합니다. rm -f 디렉토리를 삭제하지 않으려면 rm -rf을 사용해야합니다.

if [[ flag_file_found_TESTD == 1 && 
    flag_file_found_TESTDF == 1 ]] then 

에는 변수 이름 앞에 $이 없습니다.

if [[ -z $ FILE_TO_UPLOAD && -z $ FILE_TO_UPLOAD1 ]] then 

$ 다음의 공백을 제거하십시오.

업데이트 2 : 모든 if 문에서

, 당신은 then 전에 ; (또는 줄 바꿈)을 놓치고있어.

모든 "B : 찾을 수 없음"오류의 원인이 확실하지 않습니다. 그러나 다른 모든 오류를 수정 한 후에는 아마도 사라지거나 쉽게 찾을 수 있습니다.

+0

: 감사합니다. 작은 따옴표를 사용하면 어떻게됩니까? 다른 문제는 무엇입니까? – user1726550

+0

대부분의 다른 문제에 대한 수정 사항을 참조하십시오. 오류 메시지에는 모두 행 번호가 있으며 오류가 무엇인지 분명해야합니다. – Barmar

+0

추가 정보는 UPDATE 2를 참조하십시오. 나는 그'if' 에러가 많은 것을 엉망으로 만들고 있다고 생각합니다. – Barmar