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


相关文章
|
1月前
|
人工智能 Shell iOS开发
AI Shell:在命令行里“对话” AI ,微软推出将 AI 助手引入命令行的 CLI 工具,打造对话式交互命令行
AI Shell 是一款强大的 CLI 工具,将人工智能直接集成到命令行中,帮助用户提高生产力。AI Shell 支持多种 AI 模型和助手,通过多代理框架提供丰富的功能和灵活的使用模式。
138 7
|
1月前
|
Java Shell Windows
java Runtime.exec()执行shell/cmd命令:常见的几种陷阱与一种完善实现
java Runtime.exec()执行shell/cmd命令:常见的几种陷阱与一种完善实现
46 1
|
2月前
|
Web App开发 网络协议 Linux
linux命令总结(centos):shell常用命令汇总,平时用不到,用到就懵逼忘了,于是专门写了这篇论文,【便持续更新】
这篇文章是关于Linux命令的总结,涵盖了从基础操作到网络配置等多个方面的命令及其使用方法。
80 1
linux命令总结(centos):shell常用命令汇总,平时用不到,用到就懵逼忘了,于是专门写了这篇论文,【便持续更新】
|
2月前
|
Shell 知识图谱
Shell printf 命令
10月更文挑战第3天
26 1
|
2月前
|
Unix Shell Linux
常见的shell命令
shell常用命令
61 11
|
3月前
|
Shell Linux
Linux shell编程学习笔记82:w命令——一览无余
Linux shell编程学习笔记82:w命令——一览无余
|
3月前
|
Java Shell Windows
java Runtime.exec()执行shell/cmd命令:常见的几种陷阱与一种完善实现
java Runtime.exec()执行shell/cmd命令:常见的几种陷阱与一种完善实现
157 5
|
2月前
|
Shell PHP
Shell echo命令
10月更文挑战第3天
25 0
|
2月前
|
JSON Java Shell
Dockerfile中RUN、CMD、ENTRYPOINT、SHELL命令的区别
理解这些指令的差异和应用场景,有助于构建高效、灵活且易于管理的Docker镜像。在实际应用中,根据需要选择合适的指令,可以有效地控制镜像构建和容器运行的行为。
241 0
|
2月前
|
SQL Shell 数据库
在TDengine容器中创建初始化数据库的Shell命令实例
以上就是在Docker容器环境中部署并初始化TDengine数据库的全过程,希望对你有所帮助。
94 0