shell脚本条件语句

目录

一、测试 test 

1、格式:

2、操作符:

3、属性测试补充:

4、语法示范:

二、字符串比较

三、常用的测试操作符

操作符:

格式:

四、逻辑测试(短路运算)

1、命令格式:

2、操作符:

3、常见条件:

五、双中括号

六、() {}

作用:

区别:

七、if 语句的结构:

1、单分支

2、双分支

3、多分支


一、测试 test 

测试文件的表达式 是否成立

1、格式:

格式1:test 条件表达式

格式2:[ 条件表达式 ]

2、操作符:

-d:测试是否为目录(Directory)

-e:测试目录或文件是否存在(Exist)

-a:测试目录或文件是否存在(Exist)

-f:测试是否为文件(File)

-r:测试当前用户是否有权限读取(Read)

-w:测试当前用户是否有权限写入(Write)

-x:测试当前用户是否有权限执行(eXcute)

-L: 测试是否为软连接文件

3、属性测试补充:

-s FILE #是否存在且非空

-t fd #fd 文件描述符是否在某终端已经打开

-N FILE #文件自从上一次被读取之后是否被修改过

-O FILE #当前有效用户是否为文件属主

-G FILE #当前有效用户是否为文件属组

4、语法示范:

[root@test1 ~]# test -d /etc/sysconfig
[root@test1 ~]# echo $?
0
[root@test1 ~]# test -f /etc/sysconfig
[root@test1 ~]# echo $?
1
[root@test1 ~]# [ -d /etc/sysconfig/ ]

#注意前后加空格
[root@test1 ~]# echo $?
0
[root@test1 ~]# [ -f /etc/sysconfig/ ]
[root@test1 ~]# echo $?
1
[root@localhost ~]# test -e qiuhe.sh &&echo "yes"
yes
&&表示 的意思 前面的表达式成立才会输出yes

二、字符串比较

比较整数数值

[ 整数1 -操作符 整数2 ] 公式

  • -eq:第一个数等于(Equal)第二个数

  • -ne:第一个数不等于(Not Equal)第二个数

  • -gt:第一个数大于(Greater Than)第二个数

  • -lt:第一个数小于(Lesser Than)第二个数

  • -le:第一个数小于或等于(Lesser or Equal)第二个数

  • -ge:第一个数大于或等于(Greater or Equal)第二个数

实例:

[  整数1  操作符  整数2  ]
[root@test1 ~]# a=2        
[root@test1 ~]# b=3
[root@test1 ~] [ $a -eq $b ]
[root@test1 ~]# echo $?
1
[root@test1 ~]# [ 2 -le 3 ]
[root@test1 ~]# echo $?
0

三、常用的测试操作符

操作符:

  • =:字符串内容相同

  • !=:字符串内容不同,! 号表示相反的意思

  • -z:字符串内容为空

  • -n: 字符是否存在

格式:

[ 字符串1 = 字符串2 ] 是否相同

[ 字符串1 != 字符串2 ] 是否不相同

[ -z 字符串 ] 是否为空

[ -n 字符串 ] 字符是否存在

四、逻辑测试(短路运算)

1、命令格式:

格式1:[ 表达式1 ]  操作符  [ 表达式2 ] ... 格式2:命令1 操作符 命令2  ...

2、操作符:

1、 && ”且“:cmd1 && cmd2 全真才为真

第一个要真 第二个也要真 才能是真

如果第一个为假 ,整个 就为假 不用执行下个操作

2、|| ”或“:cmd1 || cmd2 一 真即为真

如果第一个 为真 那么 不用执行第二个

第一个为假 ,才需要执行第二个

3、常见条件:

  • -a或&&:逻辑与,“而且”的意思,全真才为真

  • -o或||:逻辑或,“或者”的意思,一真即为真

  • !:逻辑否

五、双中括号

[[ expression ]] 用法 == 左侧字符串是否和右侧的PATTERN相同

注意:此表达式用于[[ ]]中,

PATTERN为通配符 =~ 左侧字符串是否能够被右侧的正则表达式的PATTERN所匹配

注意: 此表达式用于[[ ]]中;扩展的正则表达式

#通配符
[root@centos8 ~]#FILE=test.log
[root@centos8 ~]#[[ "$FILE" == *.log ]]
[root@centos8 ~]#echo $?
0
[root@centos8 ~]#FILE=test.txt
[root@centos8 ~]#[[ "$FILE" == *.log ]]
[root@centos8 ~]#echo $?
1
[root@centos8 ~]#[[ "$FILE" != *.log ]]
[root@centos8 ~]#echo $?
0

正则表达式:
str=test.sh;[["$str" =~  sh$ ]];echo $?

六、() {}

作用:

( 命令1;命令2;... ){ 命令1;命令2;...; } 

都可以将多个命令组合在一起,批量执行

区别:

实验目录自创即可

1、() :

2、{} :

3、应用例子:
cd /opt
touch 123

#上述两条命令就相当于
( cd /opt;touch 123 )

实际用法:
#!/bin/bash
( cd /opt;touch 123 )

#将想要用到的命令组合起来形成脚本,批量执行

七、if 语句的结构:

1、单分支

if 判断条件
then
 条件为真的分支代码

fi   

例子:
#!/bin/bash
if [ 5 gt 4 ]

#如果条件符合 5 大于 4 
then
#那么
echo "正确"
#输出 正确 来做应答,这里也可以自行选择其他命令
fi

2、双分支

if 判断条件;
then
 条件为真的分支代码
else 判断条件
 条件为假的分支代码
fi

例子:判断是否为超级管理员
#!/bin/bash
if [ `id -u` -eq 0 ]
then
echo "该用户是管理员"
else
echo "该用户不是管理员"
fi

脚本创建与运行:

脚本配置:

3、多分支

if 判断条件1
then
 命令序列 I

elif 判断条件2
then
 命令序列3

elif 判断条件3
then
 命令序列3

elif 判断条件4
then
 命令序列4
......

fi

例子1:编辑检测成绩结果脚本
#!/bin/bash
read -p "请输入你的考试分数:" num


if [ $num -ge 90 -a $num -le 100 ]
then
echo "优秀"
elif [ $num -ge 70 -a $num -lt 90 ]
then
echo "良好"
elif [ $num -ge 60 -a $num -lt 70 ]
then
echo "合格" 
elif [ $num -lt 60 ]
then
echo "罚抄100遍"
else
echo "输入有误,请输入 0-100 之间的正整数"
bash $0
fi

1、创建与编辑脚本

2、编写脚本

3、运行脚本


例子2:编辑一个石头剪刀布小游戏脚本

#!/bin/bash

read -p "请输入 1布 2锤子 3剪子:" human
#通过键盘输入,给变量赋值
 

m=`echo $[RANDOM%3+1]`
#m 取值为 1-3 之前的随机数

if [ $human -eq $m ]
then
echo "人机平手"

#人机取值相等,则判定人机平手

elif [ $human -eq 1 -a $m -eq 2 -o $human -eq 2 -a $m -eq 3 -o $human -eq 3 -a $m -eq 1 ]
then
echo "你赢了"

#人类取值所代表的工具克制机器取值所代表的工具,则判定人类胜利

elif [ $human -eq 1 -a $m -eq 3 -o $human -eq 2 -a $m -eq 1 -o $human -eq 3 -a $m -eq 2 ]
then
echo "你输了"

#人类取值所代表的工具被机器取值所代表的工具克制,则判定机器胜利

else
echo "输入有误,请输入1-3之间的正整数"
bash $0

#若取值不在 1-3 之间,则判定输入有误,并且需要返回重新输入
fi

1、创建与编辑脚本

2、编写脚本

3、运行脚本

例子3:创建新用户脚本

#!/bin/bash
read -p "请输入你要新建的用户名:" name
grep -q $name /etc/passwd

if [ $? -eq 0 ]
then
echo "该用户已存在"
exit
else
useradd $name
pass=`cat /dev/random |tr -dc [[:alnum:]]|head -c 12`
echo $pass |passwd $name --stdin
echo "$name : $pass" >> /opt/pass.txt
fi

1、创建脚本

2、编写脚本

3、运行脚本

八、case语句

case支持glob风格的通配符:
*       任意长度任意字符
?       任意单个字符
[0-9]  指定范围内的任意单个字符
|        或者;如: a|b

语法:
cat <<EOF
1.web1
2.mysql
3.doker
EOF

read -p "请输入数字(1-3):" num

case $num in
1)
ssh $web1
;;

2)
ssh $mysql
;;

3)
ssh $doker
;;

esac

例子:工具箱脚本
#!/bin/bash
cat <<xxx
----------------
1、关闭防火墙
2、关闭安全机制
3、显示内存信息
4、显示cpu信息
5、显示磁盘信息
6、显示网卡信息
7、退出
---------------
xxx

read -p "请选择操作(1-7):" num

case $num in
1)
systemctl stop firewalld
bash $0
;;

2)
setenforce 0
bash $0
;;

3)
free -h
bash $0
;;

4)
lscpu
bash $0
;;

5)
lsblk
bash $0
;;

6)
ifconfig
bash $0
;;

7)
exit
;;

esac
 

1、创建脚本

2、编写脚本

3、运行脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值