shell - 02 - Shell的转折点:流程与控制
文章目录
使用 if - then 语句
与高级语法中的if语句一样,如果满足某个条件就执行对应条件内的逻辑(条件、语法、赋值等等)
语法
不同于高级语言中的语法格式
if command | condition # 命令或者条件
then # then 是固定写法
commands
fi # 也是固定写法
一个简单的 if - then 示例
#! /bin/bash
if pwd
then
echo "It's WORKS"
fi
#! /bin/bash
if pwdaaa
then
echo "It's WORKS"
fi
通常情况下不止一个 if ,if 只对符合的条件进行判断,那么不符合的条件呢? 和高级语言一样,shell中也有 else 条件判断。见下文!
使用 if - then - else 语句
其他语言中是有 else 条件判断的,同样的在 shell 中也有!
语法
if command | condition # 命令或者条件
then # then 是固定写法
commands
else # if 条件取反,不符合条件情况下的判断
commands
fi # 也是固定写法
一个 简单的 if - then - else 语句 示例
#! /bin/bash
if ps -ef | grep mysqld | grep -v grep &> /dev/null # 将 ps 输出的内容丢进黑洞 [/dev/null 相当于win的垃圾桶]
then
echo "MySQL is RUNNING"
else
echo "MySQL is STOPED"
fi
嵌套if
当存在多种情形条件需要判断可以使用嵌套if来进行解决
语法
if command | condition # 命令或者条件
then # then 是固定写法
commands
elif command | condition
then
commands
else
commands
fi
以上一节点的检测 MySQL 存活状态为例进行修改
#! /bin/bash
if ps -ef | grep mysqld | grep -v grep &> /dev/null ; then
echo "MySQL is RUNNING"
elif ps -ef | grep sshd | grep -v grep ; then
echo "SSH is RUNNING"
else
echo "MySQL is STOPED"
fi
条件测试 - 数值比较
shell 中的 数值比较符
n1 -eq n2 : 等于, 相等返回true,否则false
n1 -ne n2 : 不等于, 相等返回false,否则true
n1 -ge n2 : 大于等于, 大于等于返回true,否则false
n1 -le n2 : 小于等于, 小于等于返回true,否则false
n1 -gt n2 : 大于, 大于返回true,否则false
n1 -lt n2 : 小于, 小于返回true,否则false
小案例 【这段shell脚本逻辑并不严谨,仅做数字比较符展示】
#! /bin/bash
if [ $1 -eq $2 ];then
echo "'$1'与'$2'相等"
elif [ $1 -ge $2 ];then
echo "'$1'大于或等于'$2'"
elif [ $1 -le $2 ];then
echo "'$1'小于或等于'$2'"
elif [ $1 -gt $2 ];then
echo "'$1'大于'$2'"
elif [ $1 -lt $2 ];then
echo "'$1'小于'$2'"
elif [ $1 -ne $2 ];then
echo "'$1'与'$2'不相等"
fi
条件测试 - 字符串比较
str1 = str2 相等比较
str1 != str2 不等比较
str1 < str2 str1 小于 str2 为true
str1 > str2 str1 大于 str2 为true
-n str1 str1 长度不是0 返回true
-z str1 str1 长度为0 则返回true
附: ①、字符串做大小的比较,实际应用中很少使用,谁会对字符串进行大小比较呢?
②、 在针对字符串进行大小比较时,需使用 “” ,进行转义,不然回进行重定向
我们再来看一下字符串是否为空的案例
#! /bin/bash
var2="hello"
if [ -n $var1 ];then
echo "var1 is not NULL"
else
echo "var1 is NULL"
fi
为什么?为什么我们 变量 var1 明明没有,是个空值,为什么这里输出的结果却是提示 var1 is not NULL 呢?
来看一下代码是怎么执行的
这里我们看到执行了一个 ‘[’ -n ‘]’ ,这是为啥呢?
其实这是 shell 中的一个坑,因为我们没有定义 var1 ,所以 var1 是个空值。这个时候 -n $var1 就直接变成 -n 了,这个时候 if 后面的 -n 被当做成了一个字符串来处理了。
所以在脚本中需要针对 $var1 加上双引号即可。[在脚本中,正常情况下,$var1 是不需要加双引号的,但是在某些极端的情况下,我们需要加双引号。比如刚刚这个情形。 ]
现在看看修改后的结果。
OK,可以了!
条件测试 - 文本比较
-d file file是否为目录
-f file file是否为文件
-e file file是否存在[至判断是否存在,无论文件或目录]
-r file file是否可读
-w file file是否可写
-x file file是否可执行
-s file file是否存在且不为空
file1 -nt file2 file1比file2新,则返回true
file1 -od file2 file1比file2旧,则返回true
看一个判断文件的小案例
#! /bin/bash
if [ -w /root/test ];then
echo "'test'存在,且具有可写权限"
elif [ -x /root/file_compare.sh ];then
echo "'file_conpare.sh'脚本文件存在,且具有可执行权限"
else
echo "脚本错误"
fi
复合条件测试
所谓复合条件我们看下面的语法,如果说必须满足多个条件的情况下,才能会执行某些命令。就需要考虑复合条件的使用了。
if condition1 && condition2
then
commands
fi
比如说我们判断多个变量之间的大小
#! /bin/bash
var1=25
var2=33
var3=88
if [ $var1 -gt $var2 ] && [ $var2 -lt $var3 ];then
echo "$var1 大于 $var2 并且 $var2 小于 $var3"
fi
if - then 中使用双括号
在高级语言中需要做一些递增递减或者加减乘除的算术运算的时候,可以使用双括号。
在 shell 中也可以利用双括号写类C语言的运算表达式。
在双括号中,有哪些运算符可以利用呢?
value++ 后增
value-- 后减
++value 先增
–value 先减
! 逻辑求反
== 相等(等等于)
> 大于
< 小于
>= 大于等于
<= 小于等于
&& 逻辑与
|| 逻辑或
因为 shell 属于解释器语言,并不严谨,在使用的时候需要注意一些注意事项、
- 双括号结构中,变量名引用可以加"$",也可以不加
- 运算符前后可以有空格,业界已没有
- 可以用于 if、for、while等循环控制结构中
- 多个运算符使用逗号分隔
下面我们看一个 双括号引用的小案例
#! /bin/bash
a=$1
b=$2
if (( $1 > $2 && $3 > $2 ));then
echo "YES"
else
echo "NO"
fi
if - then 中使用双方括号
同样的,在 shell 中也可以使用双方括号编写支持类C语言的条件测试
和上文类似,我们看一下单方括号在 if then 语句中的使用方法
if [ $n1 -gt $2 ] && [ $n2 -lt $n3 ]
then
commands
fi
再来看看 双方括号的条件测试语法
if [[ $n1 -gt $n2 && $n2 -lt $n3 ]]
then
commands
fi
注意事项:
双方括号结构中,变量名引用必须加$
[[ 后面必须有空格,]] 前面也必须要有空格
根据上一小节的小脚本我们再看一个双方括号的脚本
#! /bin/bash
a=$1
b=$2
c=$3
if [ $1 -gt $2 ] && [ $3 -gt $2 ];then
echo "YES"
else
echo "NO"
fi
if [[ $a > $b && $b < $c ]];then
echo "YES"
else
echo "NO"
fi
case 命令
case…easc 与其他语言中的 swich…case 语句类似,都是一种多分支选择结构。
case 语句匹配一个值或这一个条件。如果匹配成功,执行相匹配的命令。
case语句的语法如下
case $var in
pattern1)
commands
;;
pattern2)
commands
;;
esac
case的工作方式如上文中的语法所示。取值后面必须为关键字 “in”,每一个模式必须以后括号结束。取值可以为变量或者常熟。匹配发现取值符合某一个模式后,其开始执行之后的命令,一直到 “;;”。 “;;” 与其他语言中的 break 类似,意思就是直接跳到整个 case 语句的最后。
如果没有匹配上任意的一个模式,可以使用 “*” 号捕获该值,通用匹配。再执行后面的命令。
来看一个小案例
#! /bin/bash
case $1 in
jack)
echo "hello jack"
;;
mike)
echo "hello mike"
;;
*)
echo "hello everyone"
esac
相关文章
- Shell入门教程:流程控制(4)case 条件判断
- JAVA学习(四):Java流程控制语句(顺序结构、if条件语句、switch条件语句、循环语句与跳转语句)
- 10 张图带你搞懂 Kubernetes Pod 的创建流程
- 在SAP Business Application Studio里创建Fiori应用的操作流程
- 设置状态栏和底部栏背景流程
- C++:C++编程语言学习之基本数据类型/流程控制(if else/switch/for/while循环语句)的简介、案例应用之详细攻略
- 字符设备驱动开发 Linux 设备号 字符设备驱动开发步骤 open 函数调用流程 设备号的组成 设备号的分配 Linux 应用程序对驱动程序的调用 字符设备注册与注销 实现设备的具体操作函数
- HBase架构详解及读写流程
- linux shell 之流程控制 if if else while
- C语言 第四章 关系、逻辑运算与分支流程控制
- 汇编语言入门五:流程控制(一)
- Linux【实操篇】—— Shell 编程入门、变量、运算符、条件判断、流程控制
- Google Play应用上架流程
- shell脚本if流程控制详解
- 【UiPath2022+C#】UiPath控制流程概述