Shell基础之变量的运算+流程控制语句

目录

变量的运算

关系运算符

布尔运算符

逻辑运算符

流程控制语句

if条件语句

单分支

双分支


变量的运算

关系运算符

        关系运算符有以下:

-eq

判断两个数是否相等,相等返回 true,否则返回 false

-ne判断两个数是否不相等,不相等返回 true,否则返回 false
-gt判断左边的数是否大于右边的数,是则返回 true,否则返回 false
-lt判断左边的数是否小于右边的数,是则返回 true,否则返回 false
-ge判断左边的数是否大于等于右边的数,是则返回 true,否则返回 false
-le判断左边的数是否小于等于右边的数,是则返回 true,否则返回 false

示例:

[root@openEuler ~]# cat relation.sh 
#!/bin/bash

a=10
b=15

[ $a -eq $b ] && echo yes || echo false

[ $a -ne $b ] && echo "$a ne $b" || echo "$a eq $b"

[ $a -gt $b ] && echo "$a gt $b" || echo "$a lt $b"

[ $a -lt $b ] && echo "$a lt $b" || echo "$a gt $b"

[ $a -ge $b ] && echo "$a ge $b" || echo "$a lt $b"

[ $a -le $b ] && echo "$a le $b" || echo "$a gt $b"

test $a -le $b  && echo "$a le $b" || echo "$a gt $b"

        使用 (()) 来进行判断

示例:

[root@openEuler ~]# echo ((2!=3))
-bash: syntax error near unexpected token `('
[root@openEuler ~]# echo $((2!=3))
1
[root@openEuler ~]# ((2!=3));echo $?
0
[root@openEuler ~]# (( 2!=3 ));echo $?
0
[root@openEuler ~]# ((2 != 3));echo $?
0
[root@openEuler ~]# a=5;
[root@openEuler ~]# a=5
[root@openEuler ~]# b=4
[root@openEuler ~]# echo $((a==b))
0
[root@openEuler ~]# echo $(($a==$b))
0

注意:

        在有些版本中使用 > 或 < 来进行比较时,需要加反斜线

#!/bin/bash

a=5
b=6

test $a > $b && echo yes || echo no


[ $a \> $b ] && echo true || echo false

[ $a < $b ] && echo "hehe" || echo "haha"

((a>b)) && echo 1 || echo 2

布尔运算符

        布尔运算符有以下几个:

非运算符,true 返回 false,false 返回 true
-o或运算符,用于连接多个比较,当都为 false 时才返回 false
-a与运算符,用于连接多个比较,当都为 true 时才返回 true

示例:

#!/bin/bash

a=10
b=20
c=15

[ $a != $b -a $b -gt $c ] && echo yes || echo no

[ $a -le $b -o $b -lt $c ] && echo yes || echo no

[ ! $a == $b ] && echo yes || echo no

逻辑运算符

        在Shell中,逻辑运算符有如下两个:

&&逻辑与,即 and,当都为 true 时,才返回 true
||逻辑或,即 or,当都为 false 时,才返回 false

示例:

#!/bin/bash

a=10
b=20

#test $a -lt $b && $b -gt 25 && echo "yes" || echo "no"

[[ $a -gt $b || $a -lt 5 ]] && echo "yes" || echo "no"

流程控制语句

if条件语句

单分支

        语法如下:

if <条件表达式>
then
	指令
fi

或者
if <条件表达式>; then
	指令
fi

示例:

        判断是否已经成功挂载光盘,如果挂载则显示光盘中的文件

示例分析

        判断是否拦截,我们可以判断文件的个数,而要得到文件的个数,我们需要是查询文件目录,然后过滤需要的内容,最后进行内容的切割,从而得到最终需要的值,通过值来进行判断就行

[root@openEuler ~]# cat ismount.sh
#!/bin/bash

num=`/usr/bin/ls -l /mnt | grep "total" | cut -d" " -f2`

if [ $num -eq 0 ] ; then
        echo 'no mount'
fi      

if [ $num -gt 0 ] ; then
        /usr/bin/ls -l  /mnt
fi

示例:

        编写脚本,判断当前的系统剩余内存的大学,如果小于10M则输出信息到日志文件中

示例分析

        1、查看内存的使用情况        free -m

        2、从查看的结果中获取剩余的内存大小             free -m | grep "Men:"

        3、对显示的内容进行压缩,将多个空格压缩成一个空格

                        free -m|grep "Mem:"|tr -s " "

        4、对这个剩余内存的大小进行判断,如果低于指定的值则输出信息到日志文件中

                       free -m|grep "Mem:"|tr -s " "|cut -d" " -f4

[root@openEuler ~]# cat free_memory.sh
#!/bin/bash

if [ $(free -m|grep "Mem:"|tr -s " "|cut -d" " -f4) -lt 3000 ] ; then
        /usr/bin/logger "free memory less 3000M"
fi

示例:

        编写脚本,判断当前脚本的执行者是否为 root 用户

示例分析:

        判断当前登录用户有以下几种方式

使用 whoami 命令来得到

使用 id -u 命令来得到当前登录用户的编号

通过系统变量来获取 echo $USER

通过用户编号的变量来获取 echo $UID
[redhat@openEuler ~]$ cat user_info.sh 
#!/bin/bash

if [ $USER != "root" ]; then
	echo "please use root user operater"
fi

双分支

        语法如下:

if <条件表达式1>; then
	指令
else
	指令
fi

示例:

        判断光盘是否挂载,如果挂载则显示挂载目录下的内容,否则执行挂载命令

[root@openEuler ~]# cat mounted.sh
#!/bin/bash

if [ $(/usr/bin/ls -l /mnt|grep "total"|cut -d" " -f2) -eq 0 ];
then
	echo "mounting....."
	/usr/bin/mount /dev/sr0 /mnt
else
	/usr/bin/ls -l /mnt
fi
[root@openEuler ~]# bash mounted.sh
mounting.....
mount: /mnt: WARNING: source write-protected, mounted read-only.
[root@openEuler ~]# bash mounted.sh
total 500
dr-xr-xr-x. 2 root root   2048 Sep 26  2023 docs
dr-xr-xr-x. 3 root root   2048 Sep 26  2023 EFI
dr-xr-xr-x. 3 root root   2048 Sep 26  2023 images
dr-xr-xr-x. 2 root root   2048 Sep 26  2023 isolinux
dr-xr-xr-x. 2 root root   2048 Sep 26  2023 ks
dr-xr-xr-x. 2 root root 491520 Sep 26  2023 Packages
dr-xr-xr-x. 2 root root   4096 Sep 26  2023 repodata
-r--r--r--. 1 root root   3033 Sep 26  2023 RPM-GPG-KEY-openEuler
-r--r--r--. 1 root root   2198 Sep 26  2023 TRANS.TBL

示例:

        判断本地仓库是否创建,如果创建则显示已经创建

示例分析

        1、查看所有本地仓库的配置内容

                cat /etc/yum.repos.d/*.repo

        2、从本地仓库的配置信息获取 baseurl 值

                cat /etc/yum.repos.d/*.repo | grep "baseurl"

        3、从过滤的内容中获取最后一条

                cat /etc/yum.repos.d/*.repo | grep "baseurl" | tail -1

        4、判断是否有本地仓库的配置

[root@openEuler ~]# cat repos.sh 
#!/bin/bash

result=`cat /etc/yum.repos.d/*.repo | grep "baseurl"|tail -1|cut -d"=" -f2`

if [ "$result" == "/mnt" ] ; then
	echo "created repository"
else
	echo "creating....."
/usr/bin/cat>/etc/yum.repos.d/yum.repo<<"EOF"
[baseOS]
name=baseOS
baseurl=/mnt
gpgcheck=0
EOF
	echo "created success"
fi

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值