练习5:写一个猜数字脚本,当用户输入的数字和预设数字(随机生成一个0-100的数字)一样时,退出,否则让用户一直输入,并且提示用户的数字比预设数字大或者小
练习6: 用Shell实现,把一个文本文档中只有一个数字的行给打印出来
[root@Shell test]# cat print_num.sh #!/bin/bash filename="your_text_file.txt" while read -r line; do # 使用正则表达式匹配只有一个数字的行 if [[ $line =\~ ^[0-9]+$ ]]; then echo "$line" fi done < "$filename"
练习7:写一个Shell脚本通过curl命令返回的状态码来判定所访问的网站是否正常,比如当前状态码200,才算正常
[root@Shell test]# cat curl.sh #!/bin/bash # 设置要访问的网站URL website="https://www.baidu.com" # 发送GET请求并获取状态码 status_code=$(curl -s -o /dev/null -w "%{http_code}" "$website") # 判断状态码是否为200 if [ "$status_code" -eq 200 ]; then echo "Website is accessible!" else echo "Website is not accessible! Status code: $status_code" fi
四、循环
练习1:使用while循环使1加到100
[root@Shell test]# cat add.sh #!/bin/bash sum=0 counter=1 while [ $counter -le 100 ] do sum=$((sum + counter)) counter=$((counter + 1)) done echo "1加到100的和为: $sum"
练习2:查看磁盘、当前使用状态,如果使用率超过80%则把结果输出到/var/log/disk.err
[root@Shell test]# cat disk.sh #!/bin/bash # 设置磁盘使用率阈值 threshold=80 # 执行df命令获取磁盘使用状态,并使用awk过滤出使用率超过阈值的行 df_output=$(df -h | awk '$5 > threshold') # 检查是否有超过阈值的行 if [ -n "$df_output" ]; then echo "$df_output" >> /var/log/disk.err echo "Disk usage exceeded the threshold and logged to /var/log/disk.err" else echo "Disk usage is within the threshold" fi
练习3:脚本批量创建10个用户,密码统一为123,需要对用户输入是否为数字和输入的名字是否为空做判断
[root@Shell test]# cat useradd.sh #!/bin/bash count=1 while [ $count -le 10 ] do echo "请输入第 $count 个用户的名字:" read username # 判断用户名是否为空 if [ -z "$username" ]; then echo "用户名不能为空,请重新输入!" continue fi echo "请输入第 $count 个用户的密码:" read password # 判断密码是否为数字 if ! [[ $password =\~ ^[0-9]+$ ]]; then echo "密码必须为数字,请重新输入!" continue fi # 创建用户并设置密码 sudo useradd -m $username echo "$username:$password" | sudo chpasswd count=$((count + 1)) done
练习4:使用case语句编写nginx启动脚本
练习5:抓阄程序,执行脚本后,想去的同学输入英文名字全拼,产生随机数01-99之间的数字,数字越大就去参加项目实践,前面已经抓到的数字,下次不能再出现相同数字;第一个同学输入名字后,屏幕输出信息,并将名字和数字记录到文件里,程序不能退出,继续等待别的学生输入。
练习6:打印一个菜单如下,然后使用循环加case语句输出用户输入菜单选项的结果
h 显示命令帮助
f 显示登陆信息
d 显示磁盘挂载
m 查看内存使用
u 查看系统负载
q 退出程序
五、控制与数组
练习1:生成0-100之间的随机数,并相加,直到大于1000,输出相加的结果
[root@Shell test]# cat addnum.sh #!/bin/bash sum=0 while [ $sum -le 1000 ] do # 生成0-100之间的随机数 random_number=$((RANDOM % 101)) sum=$((sum + random_number)) done echo "和大于1000的结果为: $sum"
练习2:生成0-100之间的随机数,并相加,直到大于1000,并判断最后一个随机数字能否被3整除
[root@Shell test]# cat 3.sh #!/bin/bash sum=0 last_random_number=0 while [ $sum -le 1000 ] do # 生成0-100之间的随机数 random_number=$((RANDOM % 101)) sum=$((sum + random_number)) last_random_number=$random_number done echo "和大于1000的结果为: $sum" # 判断最后一个随机数字是否能被3整除 if [ $((last_random_number % 3)) -eq 0 ]; then echo "最后一个随机数字 $last_random_number 能被3整除" else echo "最后一个随机数字 $last_random_number 不能被3整除" fi
练习3:判断/tmp/目录下是否有大于4K的文件,如果有则输出该文件的大小与创建时间
[root@Shell test]# cat 4K.sh #!/bin/bash path="/tmp/" # 使用find命令查找/tmp/目录下大于4K的文件,并使用-printf选项输出文件大小和创建时间 find "$path" -type f -size +4k -printf "文件:%p,大小:%s字节,创建时间:%TY-%Tm-%Td %TH:%TM:%TS\n"
练习4:数组array=(1 2 3 4 5 6)使用脚本打印出每个元素,每行显示一个元素
[root@Shell test]# cat array.sh #!/bin/bash array=(1 2 3 4 5 6) # 使用for循环遍历数组 for element in "${array[@]}" do echo "$element" done
练习5:使用数组判断 I am koten welcome to my hometown 中字母数大于6的单词
[root@Shell test]# cat array_6.sh #!/bin/bash sentence="I am koten welcome to my hometown" words=($sentence) # 使用for循环遍历数组中的每个单词 for word in "${words[@]}" do # 统计单词中的字母数 length=${#word} # 判断字母数是否大于6 if [ $length -gt 6 ]; then echo "$word" fi done
六、实战进阶
练习1:检测服务器中重要的文件是否被修改,如果修改则报警(使用指纹)
[root@Shell test]# cat fingerprint.sh #!/bin/bash # 定义重要文件的路径和对应的指纹 declare -A important_files=( ["/path/to/file1"]="fingerprint1" ["/path/to/file2"]="fingerprint2" ["/path/to/file3"]="fingerprint3" ) # 检测文件是否被修改 for file in "${!important_files[@]}"; do # 计算当前文件的指纹 current_fingerprint=$(md5sum "$file" | awk '{print $1}') # 比较当前指纹和预设的指纹 if [[ "$current_fingerprint" != "${important_files[$file]}" ]]; then echo "警报!文件 $file 已被修改!" # 在此处添加触发报警的操作,比如发送邮件或短信通知管理员 fi done
练习2:计算nginx日志中访问最多的10个IP使用的流量综合
[root@Shell test]# cat ip.sh #!/bin/bash logfile="access.log" # 使用awk命令提取日志中的IP和流量信息,并按照IP统计流量总和 ip_traffic=$(awk '{ ip[$1] += $10 } END { for(i in ip) print i, ip[i] }' "$logfile") # 使用sort命令对流量进行降序排序 sorted_ip_traffic=$(echo "$ip_traffic" | sort -k2 -rn) # 使用head命令获取前10个IP和对应的流量 top_10_ip_traffic=$(echo "$sorted_ip_traffic" | head -n 10) # 输出结果 echo "访问最多的10个IP使用的流量综合:" echo "$top_10_ip_traffic"
练习3:防止DOS攻击,检测nginx日志,若某个IP短时间的PV过大则使用防火墙将其禁掉
[root@Shell test]# cat iptables.sh #!/bin/bash logfile="access.log" threshold=100 # 设置阈值,表示短时间内的页面访问量上限 ban_time=60 # 设置禁用时间,单位为秒 # 使用awk命令提取日志中的IP信息,并统计每个IP的页面访问量 ip_pv=$(awk '{ ip[$1]++ } END { for(i in ip) print i, ip[i] }' "$logfile") # 使用while循环遍历PV统计结果 while IFS= read -r line; do ip=$(echo "$line" | awk '{print $1}') pv=$(echo "$line" | awk '{print $2}') # 判断页面访问量是否超过阈值 if [ "$pv" -gt "$threshold" ]; then echo "警报!IP $ip 的短时间内页面访问量过大!" # 使用防火墙命令禁用IP iptables -A INPUT -s "$ip" -j DROP # 等待一段时间后解禁IP sleep "$ban_time" iptables -D INPUT -s "$ip" -j DROP fi done <<< "$ip_pv"
练习4:实时监控服务器CPU使用率大于80%,磁盘使用率大于80%,内存使用率大于80%时报警
[root@Shell test]# cat cpu_disk.sh #!/bin/bash # 配置监控阈值 cpu_threshold=80 disk_threshold=80 memory_threshold=80 # 检查CPU使用率 check_cpu() { cpu_usage=$(sar -u 1 1 | grep Average | awk '{print 100 - $NF}') if [ "$cpu_usage" -gt "$cpu_threshold" ]; then echo "警报!CPU使用率超过 $cpu_threshold%!" # 在此处添加触发报警的操作,比如发送邮件通知管理员 fi } # 检查磁盘使用率 check_disk() { disk_usage=$(df -h | awk '/\/$/ {print $5}' | sed 's/%//') if [ "$disk_usage" -gt "$disk_threshold" ]; then echo "警报!磁盘使用率超过 $disk_threshold%!" # 在此处添加触发报警的操作,比如发送邮件通知管理员 fi } # 检查内存使用率 check_memory() { memory_usage=$(free | awk '/Mem/ {printf "%.2f", $3/$2 * 100}') if (( $(echo "$memory_usage > $memory_threshold" | bc -l) )); then echo "警报!内存使用率超过 $memory_threshold%!" # 在此处添加触发报警的操作,比如发送邮件通知管理员 fi } # 持续监控 while true; do check_cpu check_disk check_memory sleep 5 done
练习5:使用二进制安装nginx,要求脚本可以重复执行
[root@Shell test]# cat nginx.sh #!/bin/bash nginx_version="1.18.0" # 设置nginx版本号 nginx_install_dir="/usr/local/nginx" # 设置nginx安装目录 # 下载nginx源码包 wget http://nginx.org/download/nginx-$nginx_version.tar.gz # 解压源码包 tar -zxvf nginx-$nginx_version.tar.gz # 进入解压后的目录 cd nginx-$nginx_version # 配置编译参数 ./configure --prefix=$nginx_install_dir # 编译和安装 make && make install # 清理临时文件 cd .. rm -rf nginx-$nginx_version rm nginx-$nginx_version.tar.gz
练习6:数据库分库分表备份到/tmp下。
[root@Shell test]# cat mysql.sh #!/bin/bash # 定义数据库连接信息 host=localhost port=3306 user=root password=123456 # 定义要备份的数据库和表 db_list=(db1 db2) table_list=(table1 table2 table3) # 遍历数据库 for db in ${db_list[@]}; do # 遍历表 for table in ${table_list[@]}; do # 构建备份文件名 bak_file=/tmp/${db}_${table}.sql # 执行备份命令 mysqldump -h$host -P$port -u$user -p$password $db $table > $bak_file # 检查备份是否成功 if [ $? -eq 0 ]; then echo "备份 $db.$table 成功" else echo "备份 $db.$table 失败" fi done done
我是koten,10年运维经验,持续分享运维干货,感谢大家的阅读和关注!