Pingfan's Blog

bash中的return code和exit status

字数统计: 569阅读时长: 2 min
2019/06/02 Share

[toc]

return code

当执行完一条命令后,可以使用$?来访问它的执行结果。如果执行成功,则=0,如果执行失败,则为1-255。例如:

[@bogon:myBlog2]$ man cp
[@bogon:myBlog2]$ echo "$?"
0
[@bogon:myBlog2]$ cat /host/sd
cat: /host/sd: No such file or directory
[@bogon:myBlog2]$ echo "$?"
1

例如下面ping的例子,如果ping通,则返回码为0表示成功,如果ping不通,则返回码为大于0的数:

#!/usr/bin/env bash

HOST="google.com"
ping -c 1 ${HOST}

if [[ $? -eq 0 ]]
then
    echo "${HOST} reachable"
else
    echo "${HOST} unreachable"
fi

结果:

[@bogon:bashlearn (master)]$ ./3.sh 
PING google.com (216.58.200.238): 56 data bytes

--- google.com ping statistics ---
1 packets transmitted, 0 packets received, 100.0% packet loss
google.com unreachable


我们可以使用$$命令对上面的shell脚本进行简化。

  • &&当且仅当前面的命令执行成功后,后面的命令才会被执行。
  • ||当且仅当前面的命令执行失败后,后面的命令才会被执行。
  • ;不管前面的命令是否执行成功,后面的命令都会执行。这种用法也非常有用。

例如:

[@bogon:myBlog2]$ ll /etc/hosts || echo "file not exists" # 由于文件存在,所以后半部分不会被执行。
-rw-r--r-- 1 root wheel 334 May 5 16:01 /etc/hosts
[@bogon:myBlog2]$ ll /etc/host || echo "file not exists" # 由于文件不存在,所以后半部分得到了执行。
ls: /etc/host: No such file or directory
file not exists

所以上面的脚本可以简化为:

#!/usr/bin/env bash

HOST="google.com"
ping -c 1 ${HOST} || echo "${HOST} unreachable"

或者:

#!/usr/bin/env bash

HOST="google.com"
ping -c 1 ${HOST} && echo "${HOST} reachable"

脚本中调用其他脚本

这种情况,被调用的脚本最好在文件最后声明exit status。这样,调用脚本时,可以知道执行的状态 是成功还是失败。

例如:

#!/usr/bin/env bash

HOST="google.com"
ping -c 1 ${HOST} 
if [[ $? -ne 0 ]]
then 
    echo "${HOST} unreachable"
    exit 1
fi

exit 0

当其他脚本调用上面的脚本时,可以在调用行的下一行使用$?来获取函数的执行结果。

返回值可以多个,例如返回1表示遇到了第一种异常情况退出,返回2表示遇到了第二种异常情况退出。

CATALOG
  1. 1. return code
  2. 2. 脚本中调用其他脚本