无法从脚本获取正确的退出代码

无法从脚本获取正确的退出代码

我有一个通过 SFTP 连接到远程服务器并从那里获取一些文件的脚本。我的脚本是这样的:

/usr/bin/sftp [email protected] <<EOF
lcd /dir1/dir2/dir3
cd /rsdir1/rsdir2/rsdir3
get file_pattern`date -d "last month" +%m%Y`.csv
EOF
rc=$?
        if [[ $rc != 0 ]]
           then
        echo "Error occured getting file and the script abended with error code $rc" `date "+%Y-%m-%d-%H.%M.%S"`
            exit 1
    else
    echo "Successfully transferred the file" `date "+%Y-%m-%d-%H.%M.%S"`
        fi

但是,即使脚本找不到具有该模式的文件,它也会转到别的脚本的一部分,并在屏幕上给我输出

Connecting to remote.server.com...
sftp> lcd /dir1/dir2/dir3
sftp> cd /rsdir1/rsdir2/rsdir3
sftp> get file_pattern032014.csv
Couldn't stat remote file: No such file or directory
File "/rsdir1/rsdir2/rsdir3/file_pattern032014.csv" not found.
Successfully transferred the file YYYY-MM-DD-24HH.MI.SS 

关于我在这里可能做错了什么有什么建议吗?

答案1

您获得了正确的返回代码,sftp 会话正确执行,因此返回代码为 0。
您应该使用scp它,如果复制失败,它不会返回 0。

你可以这样做:

file=file_pattern`date -d "last month" +%m%Y`.csv 
[email protected]:/rsdir1/rsdir2/rsdir3/$file
local=/rsdir1/rsdir2/rsdir3/$file

if scp -q $remote $local
then
    echo "Successfully transferred the file" `date "+%Y-%m-%d-%H.%M.%S"`
else
    echo "Error occured getting file and the script abended with error code $?" `date "+%Y-%m-%d-%H.%M.%S"`
    exit 1
fi

编辑:我将复制目标更改为文件名:如果复制到某个目录并且该目录丢失,您将创建一个具有该目录名的文件。

答案2

请尝试以下操作:

/usr/bin/sftp -b - [email protected] <<EOF ...

“-b -”将 sftp 置于批处理模式,同时仍从命令行读取。当 sftp 命令之一失败时,批处理模式将(在我的系统上)退出 sftp 并返回非零退出代码。

相关内容