shell 的每一条命令,无论是内置的,外部的,还是shell 函数,当它退出时都会返回一个小的整数值,
给引用他的程序,这就是程序的退出状态,我们会经常用到,比如 if for test 等等,这些命都需要
使用程序的退出状态来,完成条件判断。
lz6.1
[root@master ~]# ls /dev/null
/dev/null
[root@master ~]# echo $?
0
[root@master ~]# ls /dev/Null;echo $?
ls: 无法访问/dev/Null: 没有那个文件或目录
2
[zm@master ~]$ file /root/pw;echo $?
/root/pw: ERROR: cannot open `/root/pw' (Permission denied)
1
echo $? (关于shell特殊变量)用于输出shell最后一次所执行的一个程序退出状态,
我们发现 成功执行的命令,退出状态为 0 ,而 没有成功执行的命令 退出状态 非0 (大于0的值都为失败)。
lz6.2 下边是在amp.sh脚本中的一段
if [ ! -d /usr/local/freetype ]
then
echo "error! can't install freetype please check ! Will now out of the script!"
exit 1
fi
如果找不到这个目录,那么test命令([ ! -d /usr/local/freetype ]为test命令快捷方式,详细介绍)退出状态 为 1 ,这里使用了逻辑运算符"!"表示取反 非1即0那么此时退出状态为0,接下来我们就可以使用 exit 命令,传递一个退出值也就是 exit 1 ,脚本会退出并返回值为1,如果只有 exit 命令 而没有参数(返回值),则以最后一个执行命令的退出状态,作为退出状态,这点需要注意了!
lz6.3
[root@master ~]#if test 1 -eq 1
> then
> echo "exit status is 0"
> else
> echo "exit status is 1"
> fi
exit status is 0
[root@master ~]#if test 1 -eq 2
> then
> echo "exit status is 0"
> else
> echo "exit status is 1"
> fi
exit status is 1
nginx_install.sh 部分
if ! grep 'nginx' /etc/passwd;then #grep没有匹配nginx,返回1,"!"非1即0
useradd nginx -s /sbin/nologin
else
echo "nginx uesr and nginx group is already exists!"
fi
lz6.2 与 lz6.3 中都使用了 if语句,它们都根据程序(命令 test/grep)退出状态来进行判断,test命令判断 整数1 是否等于 整数1, (将在下一节详细介绍test命令和它的快捷方式"[]")如果相等则成功并返回0,执行then后边的语句,相反 如果不相等则失败并返回1,执行else后边的语句,所以 if 语句与程序退出状态是结合在一起的,if语句还可以当成“开关”(多条件判断)语句使用,不过我更喜欢使用case语句,来完成同样的功能。
lz6.4 下行的case语句是在newtc.sh脚本中的一段,case语句比较简单要测试的值在case 与 in 之间,在列表中依次测试
发现匹配的时候,便执行相应的程序代码,直至;;为止
case "$1" in
start)
echo "start!"
tc_main
exit 0
;;
clear)
echo "clear!"
tc_clear
exit 0
;;
......
......
*)
echo "Usage: $0 {start|clear|vip|show}"
exit 1
esac
使用双括号语法扩展if语句,双括号语法请参考这里
if(($k>=10));then
k=a
echo $k
exit 2
fi
lz6.5
[root@master ~]# if grep 'ROOT' /etc/passwd ;then :;else echo "not found";fi
not found
[root@master ~]# if ! grep 'ROOT' /etc/passwd; then echo "not found";fi
not found
第一if判断中 then使用了':',它什么都不做而只是为了使用else部分,其实不用这么麻烦,我们可以在shell中使用
逻辑的not(!) ,and(&&) ,or(||),比如第二个if判断 使用逻辑非运算符,grep 没有匹配到 'ROOT' 此时退出状态值为 1, 而
! 1 ,我们知道 逻辑值只有两个 非 0 即 1, 那么此时退出状态值 变为 0, 同样的 and(&&) ,or(||) 也是这样,比如lz6.5
lz6.5
[root@master ~]# if test -e /etc/passwd && grep 'root' /etc/passwd;then echo ok;else echo no;fi
root:x:0:0:root:/root:/bin/bash
ok #两个命令都必须成功执行(逻辑与)
[root@master ~]# if test -e /etc/PASSWD || grep 'root' /etc/passwd;then echo ok;else echo no;fi
root:x:0:0:root:/root:/bin/bash
ok #两个命令有一个命令成功执行即可(逻辑或)
本文转自 dongnan 51CTO博客,原文链接: