当执行完一条命令后,可以使用$?
来访问它的执行结果。如果执行成功,则=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表示遇到了第二种异常情况退出。