1.bash条件判断
1.1 条件测试类型
整数测试
字符测试
文件测试
1.2 条件测试的表达式
[ expression ]
[[ expression ]]
test expression
1.3 整数测试
-eq //测试两个整数是否相等
-ne //测试两个整数是否不等
-gt //测试一个数是否大于另一个数
-lt //测试一个数是否小于另一个数
-ge //大于或等于
-le //小于或等于
1.4 字符测试
== //等值比较,检查==两边的内容是否一致,==两边都要有空格
!= //检查两边内容是否不一致,不一致为真,一致为假
=~ //左侧字符串是否能够被右侧的PATTERN所匹配到。此表达式应用于双中括号[[]]中
-z "string" //测试指定字符串是否为空,空则为真,不空则为假
-n "string" //测试指定字符串是否不空,不空则为真,空则为假
1.5 文件测试
//存在性测试:
-e //测试文件是否存在
//存在性及类别测试:
-b //测试文件是否为块设备文件
-c //测试文件是否为字符设备文件
-f //测试文件是否为普通文件
-d //测试指定路径是否为目录
-h //测试文件是否为符号链接文件
-L //测试文件是否为符号链接文件
-p //测试文件是否为命名管道文件
-S //测试文件是否为套接字文件
//文件权限测试:
-r //测试当前用户对指定文件是否有读权限
-w //测试当前用户对指定文件是否有写权限
-x //测试当前用户对指定文件是否有执行权限
//文件特殊权限测试:
-g //测试文件是否有sgid权限
-u //测试文件是否有suid权限
-k //测试文件是否有sticky权限
//文件大小测试:
-s //测试文件是否非空
//文件是否打开测试:
-t fd //fd表示的文件描述符是否已经打开且与某终端相关
//双目测试:
file1 -ef file2 //测试file1与file2是否指向同一个设备上的相同inode,说白点就是两者是不是同一个文件
file1 -nt file2 //测试file1是否比file2新
file1 -ot file2 //测试file1是否比file2旧
//无分类:
-N //测试文件自从上一次被读取之后是否被修改过
-O //测试文件是否存在并且被当前用户拥有
-G //测试文件是否存在并且默认组是否为当前用户组
1.6 组合测试条件
-a //与关系
-o //或关系
! //非关系
[ $# -gt 1 -a $# -le 3 ]
[ $# -gt 1 ] && [ $# -le 3 ]
1.7 条件判断,控制结构
1.7.1 单分支if语句
if 判断条件; then
statement1
statement2
......
fi
1.7.2 双分支if语句
if 判断条件; then
statement1
statement2
......
else
statement3
statement4
......
fi
1.7.3 多分支if语句
if 判断条件1; then
statement1
statement2
......
elif 判断条件2; then
statement3
statement4
......
else
statement5
statement6
......
fi
2. 分支选择
2.1case语句
case $变量名 in
value1)
statement
...
;;
value2)
statement
...
;;
*)
statement
...
;;
esac
//case支持glob风格的通配符:
* //任意长度任意字符
? //任意单个字符
[] //指字范围内的任意单个字符
abc|bcd //abc或bcd
3. 循环语句
循环语句通常需要有一个进入条件和一个退出条件。
3.1 for循环
for循环当列表不为空时进入循环,否则退出循环
for 变量 in 列表; do
循环体
done
for ((expr1;expr2;expr3))
{
循环体
}
for (( expr1 ; expr2 ; expr3 ));do
循环体
done
expr1 //用于指定初始条件,给控制变量一个初始值
expr2 //判定什么时候退出循环
expr3 //修正expr1指定的变量的值
//如何生成列表:
{1..100}
seq [起始数] [步进长度] 结束数
3.2 while循环
while循环适用于循环次数未知的场景,注意要有退出条件。
条件满足时进入循环,条件不满足了退出循环。
3.2.1 while循环正常用法
while 条件; do
statement
...
done
3.2.2 while循环特殊用法
//while循环特殊用法一:死循环
while :;do
statement
...
done
//这里的冒号可以改成任何非空值
while循环特殊用法二:逐行读取某文件,将值存入line变量中
while read line;do
statement
...
done < /path/to/somefile
3.3 until循环
条件不满足时进入循环,条件满足了退出循环。
until 条件; do
statement
...
done
3.4 循环语句特殊情况
在循环语句中,有几种特别情况:
- break [num]:提前退出循环。当循环语句中出现break时,将提前退出循环,不再执行循环后面的语句
- continue [num]:提前结束本轮循环而进入下一轮循环。当循环语句执行到continue时,continue后面的语句将不再执行,提前进入下一轮循环
4. 定义脚本退出状态码
//exit命令用于定义执行状态结果
exit # //此处的#号是一个数字,其范围可以是0-255
如果脚本没有明确定义退出状态码,那么,最后执行的一条命令的退出码即为脚本的退出状态码
注意:脚本中一旦遇到exit命令,脚本会立即终止
5.实例
5.1一直ping和tcpping某个文件中的ip,不通则发告警邮件
#!/bin/bash
# ping and tcpping ip or domain name in file
ip_file=$1
while :;do
for i in $(cat $ip_file);do
ping -c 3 $i >/dev/null
status1=$(echo $?)
status2=$(tcpping $i -p 53 -c 1 |tr '
' ';'|awk '{if($1=="OK")print "0" ;else print "1" }') 2>/dev/null
if [ "$status1" -ne 0 ] || [ "$status2" -ne 0 ];then
date=$(date -d "today" +"%Y-%m-%d_%H:%M:%S")
if [ "$status1" -ne 0 ] && [ "$status2" -ne 0 ];then
echo "$i Server Ping and Tcpping Port 53 is down ${date}"|mail -s "Server $i" 1576014300@qq.com
echo "$i:status1:$status1 - $i:status2:$status2"
elif [ "$status1" -ne 0 ];then
echo "$i Server Ping is down ${date}"|mail -s "Server $i" 1576014300@qq.com
echo "$i:status1:$status1"
else
echo "$i Server Tcpping Port 53 is down ${date}"|mail -s "Server $i" 1576014300@qq.com
echo "$i:status2:$status2"
fi
fi
sleep 60
done
done
5.299乘法表
#!/bin/bash
# multiplication table
for i in $(seq 9);do
for j in $(seq $i);do
echo -en "${j}x${i}=$[$i * $j] "
done
echo
done
[root@localhost ~]# ./99.sh
1x1=1
1x2=2 2x2=4
1x3=3 2x3=6 3x3=9
1x4=4 2x4=8 3x4=12 4x4=16
1x5=5 2x5=10 3x5=15 4x5=20 5x5=25
1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36
1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49
1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64
1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81
5.3编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机
#!/bin/bash
for i in {1..254};do
ping -c 3 -i 0.3 -w 1 192.168.1.$i &>/dev/null
#每隔0.3秒ping一次,一共ping2次,并以1毫秒为单位设置ping的超时时间
if [ $? eq 0 ];then
echo "192.168.1.$1 is up"
else
echo "192.168.1.$i is down"
fi
done