目录
一、测试 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
命令序列 Ielif 判断条件2
then
命令序列3elif 判断条件3
then
命令序列3elif 判断条件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
fi1、创建与编辑脚本
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 之间,则判定输入有误,并且需要返回重新输入
fi1、创建与编辑脚本
2、编写脚本
3、运行脚本
例子3:创建新用户脚本
#!/bin/bash
read -p "请输入你要新建的用户名:" name
grep -q $name /etc/passwdif [ $? -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
EOFread -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、退出
---------------
xxxread -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、运行脚本