# 语法1:
if <条件表达式>
then
指令
fi
#语法2:
if <条件表达式>;then
指令
fi
if <条件表达式>
then
指令序列1
else
指令序列2
fi
if 条件表达式1
then
指令序列1
elif 条件表达式2
then
指令序列2
else
指令序列n
fi
[root@server ~]# vim choice1.sh
#!/bin/bash
read -p "请输入第一个整数: " x
read -p "请输入第二个整数: " y
max=$x
if (($max<$y))
then
max=$y
fi
echo "最大值:$max"
[root@server ~]# 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
# 检查当前账户4种方法:
[root@server ~]# whoami
[root@server ~]# id -u
[root@server ~]# echo - $USER
[root@server ~]# echo - $UID
[root@server ~]# vim choice3.sh
#!/bin/bash
if [ "$USER" != "root" ]
then
echo "please switch user root"
fi
[root@server ~]# mv choice3.sh / # 移动脚本到根
[root@server ~]# su fox # 切换账户身份
[fox@server root]$ cd /
[fox@server /]$ bash choice3.sh
please switch user root
# 闰年:能被4整除但不能被100整除或者能被400整除的年份
[root@server ~]# vim choice4.sh
#!/bin/bash
read -p "请输入四位数年份: " year
if [ $(($year%4)) -eq 0 ] && [ $(($year%100)) -ne 0 ] || [ $(($year%400)) -eq 0 ]
then
echo "$year 年是闰年"
else
echo "$year 年是平年"
fi
# 分析
# 1.通过分析服务执行的进程数判断
[root@server ~]# ps -ef | grep 服务名 | grep -v grep | wc -l
# 2.通过查看是否开放端口判断
[root@server ~]# netstat -lntup | grep 端口号 | wc -l
[root@server ~]# choice5.sh
#!/bin/bash
num=$(ps -ef | grep sshd | grep -v grep | wc -l)
if (($num>0))
then
echo "sshd is running"
else
echo "sshd is not running"
fi
[root@server ~]# choice6.sh
read -p "请输入百分制成绩: " score
if [ -z $score ]
then
echo "未输入,请重新输入."
elif (($score<0 || $score>100 ))
then
echo "成绩输入有误,请输入0-100间整数成绩"
elif (($score >= 90))
then
echo "成绩优秀"
elif (($score >=80))
then
echo "成绩良好"
elif (($score>=60))
then
echo "成绩及格"
else
echo "补考"
fi
[root@server ~]# choice7.sh
#!/bin/bash
vendor=$(grep "vendor_id" /proc/cpuinfo | uniq | cut -d " " -f2)
if [ $vendor == GenuineIntel ]
then
echo "Inter"
elif [ $vendor == GenuineAMD ] # AuthenticAMD
then
echo "AMD"
else
echo "unknow"
fi
[root@server ~]# choice8.sh
#!/bin/bash
read -p "请输入测试主机的IP地址:" ip
ping -c 2 -w 3 $ip &> /dev/null
# -c 2 表示发出2个数据包,-w 3表示等待3秒结束,注意:不能等待1秒结束,有可能第二个包未返回就结束会报错
if [ $? -eq 0 ]
then
echo "主机$ip已运行"
else
echo "主机$ip未运行"
fi
# 上例修改,使用循环测试多台主机,存活的主机显示应用高亮的颜色显示
#!/bin/bash
for ip in 192.168.48.{125..135}
do
ping -c 2 -w 3 $ip &> /dev/null
if [ $? -eq 0 ]
then
echo -e "\e[1;31m主机$ip已运行\e[0m"
else
echo "主机$ip未运行"
fi
done
[root@server ~]# vim choice9.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
case 变量名 in
值1)
指令1
;;
值2)
指令2
;;
值3)
指令3
;;
*)
默认
esac
[root@server ~]# vim choice10.sh
#!/bin/bash
read -p "请输入百分制成绩: " score
case $score in
9[0-9]|100)
echo "成绩优秀"
;;
8[0-9])
echo "成绩良好"
;;
6[0-9]|7[0-9])
echo "成绩及格"
;;
*)
echo "补考"
esac
for 循环变量 in {list}
do
statement1
statement2
...
done
分析
例1:
[root@server ~]# vim for1.sh
#!/bin/bash
for ip in 192.168.48.130 192.168.48.131
do
echo $ip
done
[root@server ~]# bash for1.sh
192.168.48.130
192.168.48.131
[root@server ~]# vim for2.sh
#!/bin/bash
for ip in 192.168.48.{130..140..2} # 使用{start..end..step} 进行扩展
do
echo $ip
done
[root@server ~]# bash for2.sh
192.168.48.130
192.168.48.132
192.168.48.134
192.168.48.136
192.168.48.138
192.168.48.140
#!/bin/bash
for file in $(ls -F / | grep /$)
do
echo $file | cut -d "/" -f1
done
# ls -F :用于将目录内的文件按照文件类型进行归类显示,会在不同类别的文件名尾部增加不同的标识符,目录以/结尾、链接文件以@结尾、可执行文件以*结尾、普通文件无符号
# grep /$ :表示过滤以/结尾的行
for variable in {start..end..step}
do
statement1
statement2
...
done
[root@server ~]# bash for4.sh
#!/bin/bash
sum=0
for i in {1..100..1}
do
((sum=sum+i))
done
echo "sum=$sum"
# 上例修改
[root@server ~]# bash for4.sh
#!/bin/bash
sum=0
for i in $(seq 100)
do
((sum=sum+i))
done
echo "sum=$sum"
for variable
do
statement1
statement2
...
done
for variable in $@或$*
do
statement1
statement2
...
done
[root@server ~]# vim for5.sh
#!/bin/bash
for arg
do
echo $arg
done
[root@server ~]# bash for5.sh {1..10}
for ((初始化;条件表达式;步长)) # 注意:2个园括号
do
statement1
statement2
...
done
[root@server ~]# vim for6.sh
#!/bin/bash
for((i=1;i<=10;i++))
do
if ! id -u temp$i &> /dev/null
then
useradd temp$i
echo "123456" | passwd --stdin tmep$i &> /dev/null
else
echo "temp$i 账户已存在"
fi
done
[root@server ~]# x=1
[root@server ~]# y=2
[root@server ~]# echo $((x++))
1
[root@server ~]# echo $x
2
[root@server ~]# echo $((++y))
3
[root@server ~]# echo $y
3
while expression
do
statement1
statement1
……
done
# 法1 ,采用exec读取文件
[root@server ~]# vim file1.txt
data1
data2
data3
data4
data5
[root@server ~]# vim while1.sh
#!/bin/bash
exec < file1.txt
while read a
do
echo $a
done
# exec < file1.txt 将file.txt文件内容读入到标准输入中
# read a 表示从标准输入中按照行读取内容到变量a
# 法2:使用cat读取文件,通过管道符进入while循环处理
cat 文件名 | while read line
do
statement1
statement1
……
done
#法3 : 在while循环尾部使用输入重定向指定输入数据
while read line
do
statement1
statement1
……
done < 文件名
[root@server ~]# vim while2.sh
#!/bin/bash
price=$[ $RANDOM%20 ]
count=0
while true
do
read -p "请输入[0-20]间的商品价格: " INT
let count++
if(($INT==$price))
then
echo "恭喜,你猜中!"
echo "你使用了$count次机会"
exit 0
elif (($INT>$price))
then
echo "你输入的商品价格高了!"
else
echo "你输入的商品价格低了!"
fi
done
until expreession
do
statement1
statement2
……
done
# while3.sh 的改写
#!/bin/bash
i=1
until [ $i -gt 10 ] # i>10 ,注意,条件要相反
do
if id -u temp$i &> /dev/null
then
userdel -r test$i
else
echo "test$i 账户已删除"
fi
let i++
done
break: 是立即跳出某个循环结构。break语句可以用在for、while或者until等循环语句的循环体中
continue: 作用不是退出循环体。而是跳过当前循环体中该语句后面的语句,重新从循环语句开始的位置执行
[root@server ~]# vim for7.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 ((i==prime))
then
echo "素数"
fi
fi
[root@server ~]# bash for8.sh
#!/bin/bash
count=0
for((i=100;i<150;i++))
do
if ((i%3==0))
then
continue
fi
echo -ne "$i\t"
((count++))
if ((count%5==0))
then
echo
fi
done
echo
[root@server ~]# bash for9.sh
#!/bin/bash
for i in $(seq 9)
do
for j in $(seq 9)
do
((j<=i)) && echo -ne "$i*$j=`echo $((i*j))` \t"
done
echo
done
[root@server ~]# bash for10.sh
#!/bin/bash
read -p "请输入图形行数:" h
for ((i=0;i<h;i++)) # 循环处理h行
do
for ((j=0;j<h-i;j++)) # 每行打印一些空格
do
echo -n " "
done
for ((k=0;k<2*i+1;k++)) # 每行打印一些星号
do
echo -n "*"
done
echo # 每行最后打印一个\n
done
[root@server ~]# bash for11.sh
#!/bin/bash
for ((i=1;i<10;i++))
do
for ((j=1;j<=10-i;j++))
do
echo -n " "
done
for ((k=1;k<=i;k++))
do
echo -n "$i"
done
echo
done
判断当前磁盘剩余空间是否有20G,如果小于20G,则将报警邮件发送给管理员,每天检查次磁盘剩余空间。
[root@server ~]# yum install s-nail -y
[root@server ~]# vim /etc/s-nail.rc
后面加上以下内容:
set from=17674044@qq.com
set smtp=smtp.qq.com
set smtp-auth-user=qq邮箱
set smtp-auth-password=授权码
set smtp-auth=login
这里使用wq!退出,由于为只读文件。
这里授权码不会的看第一章例行性工作查看具体步骤。
[root@server ~]# vim disk1.sh
[root@server ~]# vim /etc/crontab
这里由于为了尽快看到效果,我这里就设置每分钟发送一次:
效果截图:
判断web服务是否运行(1、查看进程的方式判断该程序是否运行,2、通过查看端口的方式判断该程序是否运行),如果没有运行,则启动该服务并配置防火墙规则。
[root@server ~]# vim test.sh
[root@server ~]# bash test.sh
[root@server ~]# vim test1.sh
[root@server ~]# bash test1.sh
使用curl命令访问第二题的web服务,看能否正常访问,如果能正常访问,则返回web serveis running;如果不能正常访问,返回12状态码。
[root@server ~]# vim test2.sh
[root@server ~]# bash test2.sh