mkdir$2||echo"我无法创建目录$2"&;出口8
大家好,这是我在这里的第一篇文章,所以请友善。
我现在正在写一个剧本,这句话让我很困扰。
只有在无法创建目录$2的情况下,才会出现退出8。在运行脚本并成功创建该目录后,它仍然在8上退出。
我是不是错过了什么?我认为"||"之后的命令只有在左侧出现false时才会发生。
我是Linux世界的新手,作为一个有点中等C经验的人,我很困惑,救命!(使用ubuntu、bash、btw)
正如@fernand0所建议的,问题在于||
和&&
运算符的优先级。您希望它运行类似mkdir || ( echo && exit )
的东西——也就是说,如果mkdir
失败,则运行echo && exit
部分。但它实际所做的是运行类似( mkdir || echo ) && exit
的东西——也就是说,如果mkdir
或echo
命令成功,它将运行exit
部分。echo
几乎总是会成功,所以它几乎总是会退出。
因此,您需要显式地对命令进行分组,以覆盖此优先级。但不要使用( )
,因为它在子shell中运行其内容,而exit
只会退出子shell,而不是主脚本;可以使用{ }
,也可以使用显式if
块。此外,您实际上并不需要echo && exit
,因为只有在echo
命令成功的情况下才会运行exit
。echo
几乎总是成功的,但在极少数失败的情况下,我确信您无论如何都希望脚本退出。
当我需要在脚本中做这样的事情时,我通常使用这个成语:
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; }