Linux:Bash:mkdir 返回什么?

7
我希望写一个简单的检查程序,在运行mkdir创建目录时进行检查。首先,它会检查目录是否已经存在,如果存在,它将跳过。如果目录不存在,它将运行mkdir,如果mkdir失败(表示脚本无法创建目录因为它没有足够的权限),它将终止。
这是我写的代码:
if [ ! -d "$FINALPATH" ]; then
    if [[ `mkdir -p "$FINALPATH"` -ne 0 ]]; then
        echo "\nCannot create folder at $FOLDERPATH. Dying ..."
        exit 1
    fi
fi

然而,第二个if语句似乎运行不正确(在成功创建目录时返回值为0)。因此,如何正确编写第二个if语句?mkdir函数在成功和失败时分别返回什么?


2
你的回答没有明确指出这一点,但是当然 mkdir -p 已经检查了目录是否存在,所以你不需要进行自己的检查。 - Neil
哦...那是真的...我完全忘记了。 - Tu Hoang
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Charles Duffy
3个回答

20

运行的结果

`mkdir -p "$FINALPATH"`

这里返回的是程序的输出,而不是返回码。 $? 才是返回码。因此你可以这样做:

if mkdir -p "$FINALPATH" ; then
    # success
else
    echo Failure
fi
或者
mkdir -p "$FINALPATH"
if [ $? -ne 0 ] ; then
    echo Failure
fi

太棒了!它正在工作。有一个小问题:if [ condition ]; thenif [ condition ] \n then之间有什么区别?我不是很明白那部分 :( - Tu Hoang
1
@Tanner 我认为这只是一种风格。 - Owen
2
@Tanner:就像任何其他上下文一样,您可以使用分号或换行符。command1; command2 就像 command1 \n command2(我希望我能在注释中使用真正的换行符!)。单词 then 必须位于行首或跟在 ; 后才能被识别;否则它只是一个单词(例如 echo then)。 - Keith Thompson
我不确定在所有的shell中,一个空的if语句体是否合法(实际上,我非常确定它不是)。你可能需要将其改为类似于: successtrue # success的形式......或者只需反转测试并不使用else子句。 - Charles Duffy

3

为了完整起见,您可以通过以下方式退出:

mkdir -p "$FINALPATH" || { echo "Failure, aborting..." ; exit 1 ; }

大括号是必须的,否则exit 1会在两种情况下都执行。

或者你可以创建一个类似于abort函数的东西:

errormsg()
{
    echo "$1"
    echo Aborting...
    { exit 1 ; }
}

然后只需通过以下方式调用:

mkdir -p "$FINALPATH" || errormsg "Failure creating $FINALPATH"

编辑:

  • 使用大括号而非小括号,因为小括号只会退出子shell。(感谢 @Charles Duffy)
  • 一个用于输出消息并退出的函数。

1
如果目标是退出解释器并返回到父脚本,你需要使用大括号 {} 而不是小括号 ()mkdir -p "$FINALPATH" || { echo "Failure, aborting..."; exit 1; } -- 注意末尾的分号 ;,如果没有换行符,则必须加上;否则,} 将被解析为 exit 的参数。 - Charles Duffy

3
更简短的方法是:
 mkdir -p "$FINALPATH" || echo failure

同样也是惯用语:

 if mkdir -p "$FINALPATH"
 then
      # .....
 fi

同样地,您可以使用while .....; do ....; doneuntil ......; do ......; done。这些语句与循环有关,可用于IT技术中。

需要更多的引号--OP的代码对于带有空格或通配符字符的目录名称是安全的;在这里也应该是这样的。 - Charles Duffy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接