目录
变量的运算
关系运算符
关系运算符有以下:
-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