具有多个命令的条件

Sta*_*sek 2 command-line bash

可以做这样的事情吗?

if
rsync $folder/coopshop/prod $folder2/coopshop
rsync $folder/coopweb/prod $folder2/coopweb
rsync $folder/unihobbyshop/shop $folder2/unihobbyshop
rsync $folder/unnihobbyweb/web $folder2/unihobbyweb
then
  echo "OK! rsync done!"
else
  echo "Error! rsync crashed!"
fi
Run Code Online (Sandbox Code Playgroud)

我知道有可能与\行尾的字符有关,但这不是一个优雅的解决方案。有一个更好的方法吗?

Eli*_*gan 6

考虑set -e

如果这是在脚本中,那么您可能需要完全删除if...then并将其放在set -e脚本的顶部。如果任何命令失败,这会导致脚本立即停止。当这些命令中的任何一个rsync失败时,它们都会显示解释失败的错误消息,因此您可能根本不需要编写自己的消息。

如果您想在运行命令之前显示已运行的命令,请使用set -x. 您可以通过编写将两者结合起来set -ex

有了&&,你就不需要了\

如果您确实决定按照您所显示的内容编写一些内容,那么正如 Ronny Blomme 所说,您可以使用 分隔命令&&。请注意,您不需要在子 shell中运行命令,即不需要将它们括在括号中。

如果在行尾编写&&运算符,则无需编写\来指定行继续。命令不能以&&(逻辑AND ) 或||(逻辑OR ) 结尾,因此 shell 将继续解析到下一行。

if
    rsync "$folder/coopshop/prod" "$folder2/coopshop" &&
    rsync "$folder/coopweb/prod" "$folder2/coopweb" &&
    rsync "$folder/unihobbyshop/shop" "$folder2/unihobbyshop" &&
    rsync "$folder/unnihobbyweb/web" "$folder2/unihobbyweb"
then
    echo 'OK! rsync commands completed successfully!'
else
    echo 'Error! some rsync command failed!'
fi
Run Code Online (Sandbox Code Playgroud)

您不必放在&&行尾。如果您愿意,可以在同一行上编写多个命令,并用分隔符分隔&&

请注意,正在测试的最终命令不会以 结尾,&&因为&& 分隔了命令。如果任何命令失败,其他命令将不会运行。

运行所有命令,即使其中一些命令失败

您可能希望运行所有rsync命令,即使其中一些命令失败,然后测试其中是否有任何命令失败并进行相应操作。为此,您可以设置 trap ERR。这不是一个实际的信号,但ERRbash 中的 signal_spec 捕获因任何原因失败的命令,包括崩溃(以及 SIGINT)。请参阅pLumo 的回答(但省略set -e继续)和William Pursell 的这篇文章;有关更多一般信息,请参阅 的输出help trap

我喜欢的方式(插入像你这样的命令)是:

failed=
trap 'failed=yes' ERR

rsync "$folder/coopshop/prod" "$folder2/coopshop"
rsync "$folder/coopweb/prod" "$folder2/coopweb"
rsync "$folder/unihobbyshop/shop" "$folder2/unihobbyshop"
rsync "$folder/unnihobbyweb/web" "$folder2/unihobbyweb"

if [ -z "$failed" ]; then
    echo 'OK! rsync commands completed successfully!'
else
    echo 'Error! some rsync command failed!'
fi
Run Code Online (Sandbox Code Playgroud)

关于我所做的其他更改......以及真正测试的内容。if command

rsync您使用参数扩展的论点,因此我冒昧地对它们进行了双引号。否则,将执行分词通配符。从上下文来看,您似乎不需要这些额外的扩展。(通常你不会。

请注意,与脚本打印的消息相反,您实际上并未测试是否有任何rsync命令崩溃。相反,您正在测试是否有任何rsync命令失败。崩溃是程序异常终止,进程被信号终止,通常是由于错误或无法合理处理的情况造成的。这种情况比正常程序终止要少得多,正常程序终止本身可能会出现退出状态,指示成功(零)或失败(其他数字)。如果rsync 确实崩溃了,上面的代码也会捕获它。但实际上,它捕获的大部分内容是正常的程序终止,并带有指示失败的退出状态。