1.if语句语法
1.1单分支结构
bash
# 语法1:
if <条件表达式>
then
指令
fi
#语法2:
if <条件表达式>;then
指令
fi
1.2双分支结构
bash
if <条件表达式>
then
指令序列1
else
指令序列2
fi
1.3多分支结构
bash
if 条件表达式1
then
指令序列1
elif 条件表达式2
then
指令序列2
else
指令序列n
fi
1.4案例
例1:编写脚本choice1.sh,利用单分支结构实现输入2个整数,输出最大值
bash
[root@master ~]# vim choice1.sh
#!/bin/bash
read -p "请输入第一个整数: " x
read -p "请输入第二个整数: " y
max=$x
if (($max<y))
then
max=$y
fi
echo "最大值:$max"
例2:编写脚本choice2.sh,判断系统内存剩余容量大小,若低于100M则发送消息进行告警
bash
[root@master ~]# vim choice2.sh
#!/bin/bash
free_mem=$( free -m | grep Mem | tr -s " " | cut -d " " -f4 )
if (($free_mem<100))
then
echo "警告,剩余内存:$free_mem ,低于警戒线100MB"
else
echo "剩余内存:$free_mem,空间足够."
fi
# free -m :表示显示内存即虚拟内存的信息,-m以MB单位显示数字
# grep Mem:表示过滤包含Mem所在行
# tr -s " ": 压缩空格为一个
# cut -d " " -f4 :以空格为间隔符,取其第4部分
例3:编写脚本choice3.sh,实现闰年的判断
bash
[root@master ~]# vim choice3.sh
#!/bin/bash
read -p "请输入4位数整数年份: " year
if [ -n "$year" ] # 非空测试
then
if ((year%4==0)) && ((year%100!=0)) || ((year%400==0))
then
echo "闰年"
else
echo "平年"
fi
else
echo "请输入有效4位整数年份"
fi
例4:编写脚本choice4.sh,判断主机是否存活
bash
[root@master ~]# vim choice4.sh
#!/bin/bash
read -p "请输入测试主机的IP地址:" ip
ping -c 2 -w 3 $ip &> /dev/null
# -c 2 表示发送2个数据包,-w 3 表示等待3秒结束,注意:不能等待1秒结束,有可能第二个数据包没有ping完就结束了,会返回错误的状态码
if [ $? -eq 0 ]
then
echo "主机$ip 已运行"
else
echo "主机$ip 未运行"
fi
例5:编写脚本choice5.sh,输入百分制成绩,判断等级成绩
bash
[root@master ~]# vim choice5.sh
#!/bin/bash
read -p "请输入百分制成绩: " score
if [ -z $score ]
then
echo "未输入,请重新输入"
elif [ $score -lt 0 -o $score -gt 100 ]
then
echo "成绩输入有误,请输入0-100间数字"
elif [ $score -ge 90 ]
then
echo "成绩优秀"
elif [ $score -ge 80 ]
then
echo "成绩良好"
elif [ $score -ge 60 ]
then
echo "成绩及格"
else
echo "补考"
fi
例6:编写脚本,根据用户输入的内容,判断是数字,字母,其他字符
bash
[root@master ~]# vim choice6.sh
#!/bin/bash
read -p "请输入数字、字母、符号: " str
if echo $str | grep [a-zA-Z] > /dev/null
then
echo "字母"
elif echo $str | grep [0-9] > /dev/null
then
echo "数字"
else
echo "符号"
fi
例7:编写脚本choice7.sh,判断当前主机cpu生产商
bash
[root@master ~]# vim choice7.sh
#!/bin/bash
vendor=$(grep "vendor_id" /proc/cpuinfo | uniq | cut -d " " -f2)
if [ $vendor == GenuineIntel ]
then
echo "Intel"
elif [ $vendor == AuthenticAMD ]
then
echo "AMD"
else
echo "other"
fi
2.for循环
2.1带列表的for循环
格式:
bash
for variable in {list}
do
statement1
statement2
...
done
2.1.2分析
variable称为循环变量
list是一个列表,可以是一系列的数字或者字符串,元素之间使用空格隔开
do和done之间的所有的语句称为循环体,即循环结构中重复执行的语句
执行时,shell会将in关键字后面的list列表的第1个元素的值赋给变量variable,然后执行循环体,当循环体中的语句执行完毕之后剩余以此类推,当list列表中的所有的元素都被访问后,for循环结构终止,程序将继续执行done语句后面的其他的语句
2.1.3例题
bash
[root@master ~]# vim for1.sh
#!/bin/bash
for ip in 192.168.75.154 192.168.75.155
do
echo $ip
done
[root@master ~]# bash for1.sh
192.168.75.154
192.168.75.155
2.2不带列表的for循环
原则:for不提供循环列表,shell将从命令行获取循环列表数据及条件,格式:
bash
for variable
do
statement1
statement2
...
done
2.2.1例题
bash
[root@master ~]# vim for2.sh
#!/bin/bash
for arg
do
echo $arg
done
[root@master ~]# bash for2.sh {1..10}
2.3基于c语言风格的for循环
2.3.1格式
bash
for ((初始化;条件表达式;步长)) # 注意:2个园括号
do
statement1
statement2
...
done
2.3.2例题:批量创建账户
bash
[root@master ~]# vim for3.sh
#!/bin/bash
for ((i=1;i<=10;i++))
do
if ! id -u test$i &> /dev/null
then
useradd test$i
echo "123456" | passwd --stdin test$i &> /dev/null
else
echo "test$i 已存在!"
fi
done
3.while循环
3.1格式
bash
while expression
do
statement1
statement1
......
done
例题:猜商品价格,通过变量RANDOM获取随机整数并控制20以内,提示用户猜测商品价格,猜测时需要记录次数,猜中后退出程序
bash
[root@server ~]# vim while1.sh
#!/bin/bash
# RANDOM是一个环境变量,产生[1,32767]的整数,对20取余是控制随机数在1-19间
PRICE=$((RANDOM%20))
count=0
while true # 恒真执行
do
read -p "请输入[1-20]间的商品价格: " INT
((count++))
if (($INT==$PRICE))
then
echo "恭喜,你猜对了!"
echo "你使用了$count次机会."
break # 跳出while循环
elif (($INT>$PRICE))
then
echo "你输入的商品价格高了."
else
echo "你输入的商品价格低了."
fi
done
4.循环控制
4.1组成
break:是立即跳出某个循环结构。break语句可以用在for,while或者until等循环语句的循环体中
continue:作用不是退出循环体。而是跳过当前循环体中该语句后面的语句,重新从循环语句开始的位置执行
4.2示例
例1:判断素数
bash
[root@master ~]# vim for10.sh
#!/bin/bash
read -p "请输入一个正整数: " prime
if ((prime<2))
then
echo "数据错误,请输入大于等于2的正整数."
else
for ((i=2;i<prime;i++))
do
if ((prime%i==0))
then
echo "平数"
break
fi
done
if ((prime==i))
then
echo "素数"
fi
fi