我有一个Shell脚本执行以下两个命令,连接到远程服务器并通过SFTP放置文件,让我们称之为“execute.sh”
sftp -b /usr/local/outbox/send.sh username@example.com
mv /usr/local/outbox/DD* /usr/local/outbox/completed/
然后在我的“send.sh”中,我有以下命令在远程服务器上执行。
cd ExampleFolder/outbox
put Files_*
bye
现在我的问题是
如果第一个命令“sftp -b”由于远程连接错误导致某些网络问题,它仍会将文件移动到“已完成的文件夹”中,这是不正确的,所以我想用一些方法来做下一步命令“mv”仅在成功连接“sftp”的第一个命令时执行。
我们可以通过增强这个shell脚本来做到这一点吗?或者一些解决方法?
My Shell是Bash。
答案 0 :(得分:4)
只需在两个命令之间插入&&
:
sftp -b /usr/local/outbox/send.sh username@example.com && \
mv /usr/local/outbox/DD* /usr/local/outbox/completed/
如果第一个失败,第二个将无法运行。
或者,您可以显式检查第一个命令的退出代码。最后一个命令的退出代码始终保存在$?
中,如果命令成功,则为0
:
sftp -b /usr/local/outbox/send.sh username@example.com
if [ $? -eq 0 ]
then
mv /usr/local/outbox/DD* /usr/local/outbox/completed/
fi
如果您真的想捕获第一个命令的输出,可以在$(...)
中运行它并将值存储在变量中:
sftpOutput="$(sftp -b /usr/local/outbox/send.sh username@example.com)"
然后在进一步检查中使用此变量,例如将其与下一个if
中的模式匹配。