2012-10-26 205 views
-1

下面的腳本是通過sftp將文件推送到遠程位置,我面臨很多問題寫在下面的代碼。但我仍然面臨一些問題,請指導我解決問題。它不適用於sh它只與ksh一起工作。Unix shell腳本錯誤

#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已經存在,並且是一個目錄,因此標記爲「創建sftp腳本」的整個部分失敗; 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

請參閱更新2瞭解更多信息。我認爲那些「如果」錯誤正在搞砸了很多東西。 – Barmar