exit 在 shell 脚本的 if 块中起什么作用?

exit 在 shell 脚本的 if 块中起什么作用?

我有一个关于 unix shell 脚本的问题。

假设你exit 1在内部执行if:它会退出还是仍然执行外部if?以下是一个虚拟示例。

if [ "$PASSWORD" == "$VALID_PASSWORD" ]; then
    if [ "$PASSWORD" -gt 10]; then
        echo "password is too large!"
        exit 1
    fi
    echo "You have access!"
    exit 1
fi

答案1

exit终止调用进程。在大多数情况下,这会退出整个脚本,即使您从循环、函数或包含的脚本内部调用它。唯一“捕获”的 shell 结构exit是引入子 shell 的结构(即分叉的子外壳进程):

  • (…)在子 shell 中执行括号内的命令的基本子 shell 结构;
  • 命令替换结构$(…)(及其已弃用的等效结构,反引号`…`),它执行命令并将其输出作为字符串返回;
  • 后台作业分叉了&;
  • a 的左侧管道 |,以及大多数 shell 的右侧(ATT ksh 和 zsh 除外);
  • 某些 shell 具有其他子进程结构,例如 ksh、bash 和 zsh 上的进程替换<(…)>(…)等。

您可以使用关键字跳出whileorfor循环break,也可以使用关键字跳出函数return

答案2

exit通常是内置的 shell,因此理论上它确实取决于您使用的 shell。但是,除了退出当前进程之外,我不知道它在哪里运行任何 shell。从 bash 手册页来看,

   exit [n]
          Cause the shell to exit with a status of n.  If  n  is  omitted,
          the exit status is that of the last command executed.  A trap on
          EXIT is executed before the shell terminates.

因此,它并不是简单地结束当前if子句,而是退出整个 shell(或进程,本质上是因为脚本是在 shell 进程中运行)。

来自 man sh,

 exit [exitstatus]
        Terminate the shell process.  If exitstatus is given it is used as
        the exit status of the shell; otherwise the exit status of the
        preceding command is used.

最后,来自 man ksh,

   † exit [ n ]
          Causes  the  shell  to exit with the exit status specified by n.
          The value will be the least significant 8 bits of the  specified
          status.   If  n  is omitted, then the exit status is that of the
          last command executed.  An end-of-file will also cause the shell
          to  exit  except for a shell which has the ignoreeof option (see
          set below) turned on.

答案3

exit将完全结束脚本。

break在循环中会上升一级 - 但在 if 语句中不会(根据我的 bash 手册页)。

相关内容