即使 mkdir 成功,"mkdir || echo && exit"退出



mkdir$2||echo"我无法创建目录$2"&出口8

大家好,这是我在这里的第一篇文章,所以请友善。

我现在正在写一个剧本,这句话让我很困扰。

只有在无法创建目录$2的情况下,才会出现退出8。在运行脚本并成功创建该目录后,它仍然在8上退出。

我是不是错过了什么?我认为"||"之后的命令只有在左侧出现false时才会发生。

我是Linux世界的新手,作为一个有点中等C经验的人,我很困惑,救命!(使用ubuntu、bash、btw)

正如@fernand0所建议的,问题在于||&&运算符的优先级。您希望它运行类似mkdir || ( echo && exit )的东西——也就是说,如果mkdir失败,则运行echo && exit部分。但它实际所做的是运行类似( mkdir || echo ) && exit的东西——也就是说,如果mkdirecho命令成功,它将运行exit部分。echo几乎总是会成功,所以它几乎总是会退出。

因此,您需要显式地对命令进行分组,以覆盖此优先级。但不要使用( ),因为它在子shell中运行其内容,而exit只会退出子shell,而不是主脚本;可以使用{ },也可以使用显式if块。此外,您实际上并不需要echo && exit,因为只有在echo命令成功的情况下才会运行exitecho几乎总是成功的,但在极少数失败的情况下,我确信您无论如何都希望脚本退出。

当我需要在脚本中做这样的事情时,我通常使用这个成语:

mkdir "$2" || {
echo "I can't create directory $2" >&2
exit 8
}

(注意:正如@CharlesDuffy所建议的,我在$2周围添加了双引号——双引号变量引用几乎总是一个好主意,以防它们包含任何空格、通配符等。我还将错误消息发送到标准错误(>&2),而不是标准输出,这通常也是一种更好的方法。)

如果你想简洁一点,你可以把它放在一行:

mkdir "$2" || { echo "I can't create directory $2" >&2; exit 8; }

请注意,在}之前需要最后一个;(或换行符),或者shell认为}只是exit的一个参数。您也可以走另一条路,使用显式if块:

if ! mkdir "$2"; then
echo "I can't create directory $2" >&2
exit 8
fi

这个选项不那么聪明和简洁,但这是一件好事——聪明和简洁正是最初导致这个问题的原因;对于代码来说,清晰明确要好得多。

||&&在其他语言中没有您习惯的优先级。不加括号,它等价于(a || b) && c(严格从左到右),而不是a || (b && c)(其中&&的优先级高于||)。将命令与||&&混合在一起很少是个好主意;而是使用if语句。

if ! mkdir "$2"; then
echo "I can't create directory $2" >&2
exit 8
fi

如果确实要使用列表运算符,请使用{ ... }对命令进行适当的分组。

mkdir "$2" || { echo "I can't create directory $2" >&2; exit 8; }

相关内容

最新更新