KSH - if/then/else 与双放大器 (&&) 和双管 (||)

Cic*_*ice 6 ksh shell-script

我想知道关于 if/then/else 的最佳实践是什么;我倾向于使用以下表格(因为我觉得它更容易阅读)

#!/usr/bin/ksh
#

[[ -f /path/to/target/file ]] && {
    echo "File exists"
} || {
    echo "No such file"
}
Run Code Online (Sandbox Code Playgroud)

而不是这种形式

#!/usr/bin/ksh
#

if [ -f /path/to/target/file ] ; then
    echo "File exists"
else
    echo "No such file"
fi
Run Code Online (Sandbox Code Playgroud)

我还在复杂块true之前包含了一个语句} || {,以确保不会执行“else”部分。

你有什么建议?

god*_*eek 8

这种风格的问题在于这两种形式并不等价。当您使用:

if command; then
    foo
else
    bar
fi
Run Code Online (Sandbox Code Playgroud)

然后要么foobar将被调用,永远不会两者都被调用。当同时使用&&and 时||,可以采用两条路径:

$ [[ -d / ]] && {
> echo "Path 1 taken"
> false
> } || {
> echo "Path 2 taken"
> }
Path 1 taken
Path 2 taken
$
Run Code Online (Sandbox Code Playgroud)

使用if cmd; then foo; else bar; fi表单时,bar被调用的条件是cmd返回false。使用cmd && foo || bar表单时,bar被调用的条件是cmd && foo返回false。

编辑:我刚刚注意到,在您的问题中,您承认您需要放在true块的末尾才能使您的版本完全正常工作。如果您愿意这样做,我不知道任何其他主要问题 - 但我认为一种风格要求您无条件地添加“true”作为块中的最后一个命令,如果有任何可能性之前的命令可能会失败,只是保证您最终会忘记它,并且事情看起来好像它们在正常工作,直到它们没有。