即使mkdir成功,也会退出“ mkdir || echo && exit”

NuS*_*ent 1 linux bash shell ubuntu

mkdir $ 2 || 回显“我无法创建目录$ 2” &&退出8

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

我现在正在编写脚本,这行困扰着我。

仅当无法创建目录$ 2时,才应出现出口8。运行脚本并成功创建该目录后,它仍在8退出。

我想念什么吗?我认为“ ||”之后的命令仅在左侧出现错误时才会发生。

我是Linux世界的新手,作为一个具有一点C中级经验的人,我很困惑,请帮助!(使用ubuntu,bash,btw)

Gor*_*son 6

如@ fernand0所建议,问题是||and &&运算符的优先级。您希望它运行类似的东西mkdir || ( echo && exit )-也就是说,echo && exit如果mkdir失败,则运行零件。但是实际上它正在运行类似的东西( mkdir || echo ) && exit-也就是说,exit如果任一mkdirOR echo命令成功,它将运行该零件。echo几乎总会成功,所以几乎总会退出。

因此,您需要对命令进行显式分组,以覆盖此优先级。但是请不要使用( ),因为那样会在子外壳程序中运行其内容,并且exit只会退出子外壳程序,而不是主脚本。您可以{ }改用,也可以使用显式if块。另外,您实际上并不需要echo && exit,因为exit只有echo命令成功后,它才会运行。echo几乎总是成功,但是在极少数情况下失败了,我很确定您还是希望脚本退出。

当我需要在脚本中执行以下操作时,通常使用以下惯用法:

mkdir "$2" || {
    echo "I can't create directory $2" >&2
    exit 8
}
Run Code Online (Sandbox Code Playgroud)

(注意:正如@CharlesDuffy所建议的那样,我在周围加上了双引号$2-如果变量引用包含任何空格,通配符等,则双引号几乎总是一个好主意。我也将错误消息发送给了标准错误(>&2)标准输出,这通常也是一种更好的处理方式。)

如果您想成为一个小人物,可以将它们全部放在一行上:

mkdir "$2" || { echo "I can't create directory $2" >&2; exit 8; }
Run Code Online (Sandbox Code Playgroud)

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

if ! mkdir "$2"; then
    echo "I can't create directory $2" >&2
    exit 8
fi
Run Code Online (Sandbox Code Playgroud)

这个选项不太聪明和简洁,但这是一件好事-聪明和简洁正是造成此问题的根本原因。清晰明确对于代码来说要好得多。