文章目录
一、条件测试
1.1 语法格式
-
test 表达式
如:test 2 = 2
,可以用echo $?查看条件测试的结果。
test表达式中空格要严格空出来,否则有语法错误
-
[ 表达式 ]
如:[ 2 = 3 ]
这里中括号里面的空格也要严格空出来。
1.2 判断字符串
== 和 !=
- 注意:在用条件测试时,如果
变量为空,那么就会报语法错误
,看下图
而当变量为空时,我们并不想让它报错,直接判断不相等就可以了。为了避免这种情况,有两种解决方法-
给变量加双引号
-
先判断一下变量是否为空
用-z
判断,变量为空则表达式正确;
! -z
,变量不为空则表达式正确
-
1.3 逻辑组合
-
格式
a && b
:a成功则执行b,a和b同时成功,a&&b才算成功
a || b
:a失败则执行b,a和b有一条成功,a || b就算成功
-
多逻辑组合
a && b && c
c是否执行,得看a && b是否成,a和b同时成功才能算成功
a || b && c
c是否执行,得看a || b是否成功,a和b有一个成功就算成功
-
综合案例
编写一个脚本,判断当前用户是否是root,如果不是,则输出“您不是root”,然后退出脚本程序
#!/bin/bash
[ $USER != root ] && echo "您不是root" && exit
1.4 数字的条件测试
-eq
(Equal):相等
-ne
(Not Equal):不等
-ge
(Greater or Equal):大于等于
-le
(Less or Equal):小于等于
-gt
(Greater Than):大于
-lt
(Less Than):小于
注意:2 == 2 实质上是将2作为字符在判断(这里有没有做隐式类型转换
,等我考证了再来改,应该是做了),而 2 -eq 2 才是将2作为数值在判断。
1.6 综合案例
如果用户数量发生变化,则发送警告消息给root,假设当前系统用户数量为30人。
#!/bin/bash
x = $(cat /etc/password | wc -l) #当前用户的数量
[ x -ne 30 ] && echo "用户数量变化,服务器可能被入侵" | mail -s "警告" root
1.5 判断文件
-e
:判断文件是否存在,不关心类型
-f
:判断文件是否存在,必须是普通文件
-d
:判断文件是否存在,必须是目录
-r
:判断当前用户对文件是否有读权限,对root无效
-w
:判断当前用户对文件是否有写权限,对root无效
-x
:判断当前用户对文件是否有x权限
二、分支语句
2.1 if 分支
- 单分支格式
if 条件测试 ; then
指令序列
fi
- 双分支格式
if 条件测试 ; then
指令序列
else
指令序列
- 多分支格式
if 条件测试 ; then
指令序列
elif 条件测试 ; then
指令序列
......
else
指令序列
fi
- 综合练习
检测并判断指定的主机是否可以ping通
#!/bin/bash
ping -c 2 -i 0.2 -W 1 $1 &> /dev/null
if test $? -eq 0 ; then
echo $1 PONG
else
echo $1 DOWN
fi
脚本执行结果为(192.168.88.88为本机IP):
2.2 case 分支
- 按照预设的值进行匹配,如果匹配成功,则进入值对应的区域执行指令,如果都不匹配,则进入默认的区域执行指令。
- 格式
case 变量 in
变量值1)
命令序列
......
命令序列;;
变量值2)
命令序列
......
命令序列;;
......
*)
默认命令序列
esac
注意:除了默认的命令序列最后不加双分号,其他的命令序列最后都要加双分号
- 案例
编写脚本购买商品,薯片5元,可乐3元,方便面2元,您有10元钱,购买完后显示余额。
#!/bin/bash
money=10
read -p "请输入商品编号[1.薯片¥5 2.可乐¥3 3.方便面¥2] : " num
case $num in
1)
let money-=5;;
2)
let money-=3;;
3)
let money-=2;;
*)
echo "输入有误!"
esac
echo "本次花费$((10-money))元, 余额$money元"
脚本运行结果为:
三、循环语句
3.1 for 循环
- 格式
for 变量 in 值1 值2 ......
do
指令序列 #前面空不空格都无所谓
down
这里的值列表可以有多种玩法
- {1…100} 等同于1 2 3 4 … 100
系统在执行这种指令时,会将这个指令先展开。但是,这种写法不支持变量,看下面的例子
可以看到,当引入变量的时候,输出并不尽人意。这是为什么呢?因为系统在执行这条指令时,本来只需要展开就可以了,但现在需要先将变量a进行替换,好家伙,结果它就只做了变量替换,不展开了,所以直接把后面的 {1..$a} 当成一个变量处理了。
- 为了解决上面的问题,我们可以用 seq 命令
seq + 数字(变量), 也可以起到展开的效果。
但是 seq 和 for 结合使用时,需要将seq的式子用反撇号或者 $() 括起来
,这样for循环才能识别
3.2 while 循环
- while循环适用于循环次数未知的情况
- 格式
while 条件测试 # 如果这里写 while : 代表死循环
do
命令序列
done
3.3 终止循环
exit
:直接退出脚本程序break
:退出整个循环continue
:退出本次循环,继续下一轮循环
四、linux系统小知识充电站
netstat -ntulp 或者 ss -ntulp
可以查询系统的端口信息grep -q
选项,过滤之后不显示任何信息- 预定义变量 $?, 只会对上一条的命令做判断,不会判断重定向的操作
- 给输出的字体改颜色
echo -e "\033[31mxxxxx\033[0m"
# 31m为颜色代号,xxxxx为输出内容,\033[ 为格式,最后的\033[0m 是为了将颜色恢复
- ping的选项
-c
:指定ping几个包
-i
:定义ping的时间间隔(s)
-W
:ping失败后等待几秒反馈结果