shell if else语句与退出状态

发布时间:2020-11-18编辑:脚本学堂
shell if语句的用法,以及shell脚本中退出状态的例子,shell命令的退出状态及返回值,没有以return 语句结束的函数,将返回最后一个语句的返回的状态。

shell命令退出状态及返回值

每个UNIX命令,当其结束时都对其调用进程(这里就是SHELL啦)返回一个整数值。这成为退出状态。

0通常为无错退出状态,而其他(1-255)通常表示错误。(但是有特例的,比如:diff这里不讨论)
shell if语句检查if关键字后的列表中最后一个语句的退出状态:

逻辑分析:

if command运行成功
then
正常处理
else
错误处理
如书中给了一个有BUG的例子,当然这是作者有意为之的了,
 

pushed()
{
dirname=$1
DIR_STACK="$dirname ${DIR_STACK:-$PWD' '}"
cd ${dirname:?"missing directory name."}
echo $DIR_STACK
}
 

此函数模拟shell的方法,将访问过的路径入栈操作。第三行,当没有为其传递参数的时候,会输出错误信息。

但是如果参数不是有效的路径,也会蒙混过关。下面用if语句来处理此BUG。

以下例子用到了shell的字符串操作,模式匹配,及命令替换。
 

pushed()
{
dirname=$1
if cd ${dirname:?"missing directory name."}     # 如果cd成功,这里判断cd的退出状态
then
DIR_STACK="$dirname ${DIR_STACK:-$PWD' '}" # 该目录入栈
echo $DIR_STACK
else
echo still in $PWD    # 要不然就沙也不干
fi
}

有时保存这个条件的退出状态是有必要的:

有两种方法能完成此工作,其一是特殊的shell变量‘?’,其返回运行的最后一个命令的退出状态
 

# 路径真实存在,返回cd的状态为0
cd /etc/
echo $?

# 路径不存在,返回cd的状态为1
cd /simaopig/
echo $?

其二,就是这篇日志标题里的“返回”语句,return,exit

return N ,使得返回它的函数以状态N退出,N是可选的,其默认为最后一个命令的退出状态(即与$?相同)

没有以return 语句结束的函数,将返回最后一个语句的返回的状态,
return只能用在函数及使用source执行的shell脚本内。

相比较,语句exit N将退出整个脚本,不管你函数有多少层。
 

cd() {
builtin cd "$@"
es=$?
echo "$OLDPWD --> $PWD"
return $es
}

注意,builtin告诉shell使用内置命令并忽略改名字的任何函数。