我有一个关于 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 上的进程替换
<(…)
、>(…)
等。
您可以使用关键字跳出while
orfor
循环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 手册页)。