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



本文转自 dongnan 51CTO博客,原文链接: 

http://blog.51cto.com/dngood/616483


相关文章
|
16天前
|
Web App开发 Java Linux
Linux之Shell基本命令篇
Linux之Shell基本命令篇
Linux之Shell基本命令篇
|
1月前
|
安全 Shell Linux
【Shell 命令集合 系统管理 】Linux 锁定终端 vlock命令 使用指南
【Shell 命令集合 系统管理 】Linux 锁定终端 vlock命令 使用指南
35 1
|
1月前
|
Shell Linux C语言
【Shell 命令集合 系统管理 】Linux 显示系统的平均负载情况 tload命令 使用指南
【Shell 命令集合 系统管理 】Linux 显示系统的平均负载情况 tload命令 使用指南
40 1
|
1月前
|
监控 Shell Linux
【Shell 命令集合 系统管理 】Linux 显示当前登录到系统的用户信息 who命令 使用指南
【Shell 命令集合 系统管理 】Linux 显示当前登录到系统的用户信息 who命令 使用指南
43 1
|
1月前
|
监控 Shell Linux
【Shell 命令集合 系统管理 】Linux 显示目前登入系统的用户信息 w命令 使用指南
【Shell 命令集合 系统管理 】Linux 显示目前登入系统的用户信息 w命令 使用指南
44 2
|
1月前
|
存储 Unix Shell
【Shell 命令集合 系统管理 】⭐⭐Linux 显示系统的基本信息 uname命令 使用指南
【Shell 命令集合 系统管理 】⭐⭐Linux 显示系统的基本信息 uname命令 使用指南
34 1
|
1月前
|
存储 Shell Linux
【Shell 命令集合 系统管理 】Linux 修改用户的属性和配置 usermod命令 使用指南
【Shell 命令集合 系统管理 】Linux 修改用户的属性和配置 usermod命令 使用指南
32 1
|
1月前
|
搜索推荐 Shell Linux
【Shell 命令集合 系统管理 】Linux 管理用户配置文件 userconf命令 使用指南
【Shell 命令集合 系统管理 】Linux 管理用户配置文件 userconf命令 使用指南
37 2
|
1月前
|
Shell Linux 数据库
【Shell 命令集合 系统管理 】Linux 创建新用户的命令 useradd命令 使用指南
【Shell 命令集合 系统管理 】Linux 创建新用户的命令 useradd命令 使用指南
47 1
|
1月前
|
安全 Shell Linux
【Shell 命令集合 系统管理 】Linux 以超级用户(root)的身份执行特权命令 sudo命令 使用指南
【Shell 命令集合 系统管理 】Linux 以超级用户(root)的身份执行特权命令 sudo命令 使用指南
42 1