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