linux命令怎么退出if,shell-6-退出状态与流程控制语句(if;test;case命令)

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                                               #两个命令有一个命令成功执行即可(逻辑或)