" mkdir ||回声&&出口"甚至当mkdir成功时退出

时间:2017-11-11 18:02:21

标签: linux bash shell ubuntu

  

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

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

我现在正在制作一个剧本,这条线让我烦恼。

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

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

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

3 个答案:

答案 0 :(得分:4)

正如@ fernand0所建议的那样,问题是||&&运算符的优先级。您希望它运行mkdir || ( echo && exit )之类的内容 - 也就是说,如果echo && exit失败,请运行mkdir部分。但是它实际上正在做的是运行像( mkdir || echo ) && exit这样的东西 - 也就是说,如果exit OR mkdir命令成功,它就会运行echo部分。 <{1}}几乎总是会成功,所以它几乎总会退出。

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

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

echo

(注意:正如@CharlesDuffy建议的那样,我在mkdir "$2" || { echo "I can't create directory $2" >&2 exit 8 } 附近添加了双引号 - 双引号变量引用几乎总是一个好主意,以防它们包含任何空格,通配符等。我还发送了错误消息标准错误($2)而不是标准输出,这通常也是更好的做事方式。)

如果你想要更专业,你可以把它全部放在一行:

>&2

请注意,mkdir "$2" || { echo "I can't create directory $2" >&2; exit 8; } 之前需要最后;(或换行符),或者shell认为}只是}的参数。你也可以采用另一种方式并使用明确的exit块:

if

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

答案 1 :(得分:1)

||&&没有您在其他语言中习惯的优先级。不平等,相当于(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; }

答案 2 :(得分:-1)

尝试:

mkdir $1
if [ $? -ne 0 ] ; then
    echo "I can't create directory $1"
    exit 8
fi