捕获Shell脚本输出并执行字符串匹配以执行下一个命令?

时间:2018-02-27 00:59:08

标签: bash shell

我有一个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。

1 个答案:

答案 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中的模式匹配。