
test 表达式
如:test 2 = 2 ,可以用echo $?查看条件测试的结果。
test表达式中空格要严格空出来,否则有语法错误

[ 表达式 ]
如:[ 2 = 3 ]
这里中括号里面的空格也要严格空出来。

== 和 !=变量为空,那么就会报语法错误,看下图
给变量加双引号

先判断一下变量是否为空
用 -z 判断,变量为空则表达式正确;
! -z,变量不为空则表达式正确

格式
a && b:a成功则执行b,a和b同时成功,a&&b才算成功
a || b:a失败则执行b,a和b有一条成功,a || b就算成功
多逻辑组合
a && b && cc是否执行,得看a && b是否成,a和b同时成功才能算成功a || b && cc是否执行,得看a || b是否成功,a和b有一个成功就算成功综合案例
编写一个脚本,判断当前用户是否是root,如果不是,则输出“您不是root”,然后退出脚本程序
#!/bin/bash
[ $USER != root ] && echo "您不是root" && exit
-eq(Equal):相等-ne(Not Equal):不等-ge(Greater or Equal):大于等于-le(Less or Equal):小于等于-gt(Greater Than):大于-lt(Less Than):小于
隐式类型转换,等我考证了再来改,应该是做了),而 2 -eq 2 才是将2作为数值在判断。1.6 综合案例
如果用户数量发生变化,则发送警告消息给root,假设当前系统用户数量为30人。
#!/bin/bash
x = $(cat /etc/password | wc -l) #当前用户的数量
[ x -ne 30 ] && echo "用户数量变化,服务器可能被入侵" | mail -s "警告" root
-e:判断文件是否存在,不关心类型-f:判断文件是否存在,必须是普通文件-d:判断文件是否存在,必须是目录-r:判断当前用户对文件是否有读权限,对root无效
-w:判断当前用户对文件是否有写权限,对root无效-x:判断当前用户对文件是否有x权限if 条件测试 ; then
指令序列
fi
if 条件测试 ; then
指令序列
else
指令序列
if 条件测试 ; then
指令序列
elif 条件测试 ; then
指令序列
......
else
指令序列
fi
#!/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):

case 变量 in
变量值1)
命令序列
......
命令序列;;
变量值2)
命令序列
......
命令序列;;
......
*)
默认命令序列
esac
注意:除了默认的命令序列最后不加双分号,其他的命令序列最后都要加双分号
#!/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元"
脚本运行结果为:

for 变量 in 值1 值2 ......
do
指令序列 #前面空不空格都无所谓
down
这里的值列表可以有多种玩法

可以看到,当引入变量的时候,输出并不尽人意。这是为什么呢?因为系统在执行这条指令时,本来只需要展开就可以了,但现在需要先将变量a进行替换,好家伙,结果它就只做了变量替换,不展开了,所以直接把后面的 {1..$a} 当成一个变量处理了。需要将seq的式子用反撇号或者 $() 括起来,这样for循环才能识别
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 是为了将颜色恢复
-c:指定ping几个包-i:定义ping的时间间隔(s)-W:ping失败后等待几秒反馈结果