zl程序教程

您现在的位置是:首页 >  其他

当前栏目

shell - 02 - Shell的转折点:流程与控制

2023-09-14 09:14:27 时间

使用 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

在这里插入图片描述