Shell编程-5

📅 发布时间:2026/7/8 16:28:55 👁️ 浏览次数:
Shell编程-5
1. 数组数组也是一种变量一组数据数组可以存放多个 相关联内容通过访问数组调用1.1. 数组赋值1.批量赋值 ip_array(10.0.0.1 10.0.0.2 10.0.0.200) array(命令结果) array(cat ip.txt) 2.逐个元素赋值 array[0]第一个值 array[1]第二个值 array[2]第三个值 3.red命令赋值 交互式输入-a参数可以赋值给数组 read -p 输入 -a array案例26书写脚本批量检查ip/域名,ip或域名存放在数组变量中#!/bin/bash ############################################################## # File Name: 26-ip_check.sh # Version: V1.0 # Author: zbl # Organization: www.zbl.com # Description: ############################################################## source /server/scripts/func.d/color_func.sh #array ip_array(cat /server/scripts/ip.txt) #ping for ip in ${ip_array[*]} do ping -c1 -W 1 ${ip} /dev/null 21 if [ $? -eq 0 ];then greenecho ${ip}可以ping通 else redecho ${ip}不可以ping通 fi done1.2. 技巧命令参数curl命令包含选项选项中还有引号可以使用数组解决curl(选项)2. Debug-xbash -x sh -x 显示脚本运行过程 一般使用这个进行调试精确控制脚本中某个范围的内容显示详细过程其他的不显示详细过程#开始 set -x 中间的内容会显示详细的执行过程 #结束 set x配合函数注释排除法使用echo输出变量内容id $user echo $? id $user rc$?3. 案例3.1. 案例27:书写系统僵尸进程检查与处理的脚本检查: top命令的 0 zombie 即可.处理:定位到具体的僵尸进程僵尸进程的pid找出僵尸进程的父进程的id,ppid判断ppid是否为1是则提示重启系统.否,提示是否要结束掉这个进程,输入yes则结束#!/bin/bash ############################################################## # File Name: 27-zombie_check.sh # Version: V1.0 # Author: zbl # Organization: www.zbl.com # Description: ############################################################## #color func func_file/server/scripts/func.d/color_func.sh if [ -f ${func_file} ];then source ${func_file} else exit 1 fi #1.vars zombie_numtop -bn 1 | awk NR2{print $(NF-1)} zombie_pidps aux | awk $8~/Z/{print $2} function check_zombie_num() { if [ ${zombie_num} -eq 0 ];then greenecho 当前系统没有僵尸进程了,继续摸鱼 else redecho 当前系统有${zombie_num}个僵尸进程,请及时处理。 check_zombie fi } #check_zombie func function check_zombie() { for id in ${zombie_pid} do zombie_ppidps -ef | grep ${id} | grep -v grep | awk {print $3} if [ ${zombie_ppid} -eq 1 ];then redecho 需要重启系统解决 else read -p 是否结束这个${zombie_ppid}进程,请输入yes,结束这个僵尸进程: yes_kill case ${yes_kill} in yes) kill ${zombie_ppid} ;; *) redecho ${zombie_ppid}僵尸进程未结束已退出 exit esac fi done } check_zombie_num3.2. 案例28: 磁盘空间不足案例检查: 1.是否有block导致的磁盘空间不足 df -h |awk -F [ %] $590 NR1 2.是否有inode导致的磁盘空间不足 df -i |awk -F [ %] $590 NR1 处理: 情况1:df -h du -sh 处理 情况2:lsof |grep delete 情况3:df -i find 大于1MB目录#!/bin/bash ############################################################## # File Name: 28-disk_check.sh # Version: V1.0 # Author: zbl # Organization: www.zbl.com # Description: ############################################################## #color func func_file/server/scripts/func.d/color_func.sh if [ -f ${func_file} ];then source ${func_file} else exit 1 fi #1.block function block_check() { disk_usedf -h / | awk NR2{print $(NF-1)} disk_statusecho ${disk_use} 60% | awk $1 $2{print ge} | grep ge | wc -l if [ ${disk_status} -ne 0 ];then redecho 当前磁盘空间使用率${disk_use},磁盘空间不足,请及时处理 block_reason else greenecho 当前磁盘空间使用率${disk_use},正常,继续摸鱼 fi } #2.inode function inode_check() { inode_usedf -i / | awk NR2{print $(NF-1)} inode_statusecho ${inode_use} 60% | awk $1 $2{print ge} | grep ge | wc -l if [ ${inode_status} -ge 1 ];then redecho 当前inode空间使用率${inode_use},inode空间不足 inode_reason else greenecho 当前inode空间使用率${inode_use},正常,继续摸鱼吧 fi } #3.deleted function block_reason() { big_filesfind /study -type f -size 1G 2/dev/null yellowecho 已找到大于1G的文件:${big_files},请及时处理 } #4.lsof_deleted function inode_reason() { big_dirfind / -type d -size 100k 2/dev/null yellowecho 已找到大于10M的目录:${big_dir},请及时处理 } #func function main() { block_check inode_check } main4. 三剑客4.1. sedsed与变量src172.16.1.210 dest192.168.16.253 sed使用单引号不会解析变量 sed s#$src#$dest#g ip.txt sed使用双引号会解析变量 sed s#$src#$dest#g ip.txt案例29书写1个修改配置文件的函数chcfg port 2222 sshd_config chcfg IPADDR 10.0.0.211 ifcfg-ens33 1.在文件中过滤是否有port的行精确过滤没有退出 grep -w sed /\b \b/s###g 2.找出这行取出当前的值22进行替换2222 3.提示配置修改完成请重启服务脚本#!/bin/bash ############################################################## # File Name: 29-change_cfg.sh # Version: V1.0 # Author: zbl # Organization: www.zbl.com # Description: ############################################################## #color func func_file/server/scripts/func.d/color_func.sh if [ -f ${func_file} ];then source ${func_file} else exit 1 fi #1.vars src$1 dest$2 file$3 #2.check_file function check_file() { if [ ! -f ${file} ];then redecho 文件不存在,请检查文件是否输入正确 exit 1 fi } #3.check_args function check_args() { if [ $# -ne 3 ];then redecho error: usage: $0 过滤的内容 修改的内容 修改的文件 exit 2 fi } #4.check_src_cont function check_src_cont() { src_contegrep -v ^$|^# ${file} | grep -wc ${src} ${file} if [ ${src_cont} -eq 0 ];then redecho error: ${src_cont},过滤的内容不存在,请重新输入 exit 3 fi } #5.sed function change_cfg() { old_contegrep -v ^$|^# ${file} | grep -w ${src} ${file} | awk -F [ ] {print $2} sed -i.bak /\b${src}\b/s#${old_cont}#${dest}#g ${file} if [ $? -eq 0 ];then grep -w ${src} ${file} greenecho 配置文件修改成功,重启服务后生效 else redecho 修改失败,请重新输入 fi } #6.func_main function main() { check_file check_args $* check_src_cont change_cfg } main $*4.2. awkawk数组统计access.log文件第一列是ip地址第10是访问的资源大小 需求01:统计每个ip出现的次数awksortuniq就可以实现 需求02:统计每个ip使用的流量 awk BEGIN{}shell中 for ip in ${ips[*]} do echo $ip done 变量获取到的是数组具体值 awk中 for(ip in ips) print ip,ips[ip] 变量获取到的是下标[下标]案例30统计去重cat /server/files/url.txtEOF http://www.etiantian.org/index.html http://www.etiantian.org/1.html http://post.etiantian.org/index.html http://mp3.etiantian.org/index.html http://www.etiantian.org/3.html http://post.etiantian.org/2.html EOF awk -F / {url[$2]} END{for(u in url) print u,url[u]} /server/files/url.txt | sort -rnk2 awk -F / {url[$2]url[$2]1} END{for(u in url) print u,url[u]} /server/files/url.txt | sort -rnk2 END{} 内容会在awk读取完成文件最后运行案例31统计去重并求和数组awk {ip[$1]ip[$1]$10} END{for(i in ip) print i,ip[i]} access.log | column -t | sort -rnk2 | head5. shell编程总结变量普通变量 命令规则环境变量 PATH , UID , LANG , PS1特殊变量: $n , $0 , $# , $* , $ , $?判断条件表达式比较大小 -eq -ne -gt -ge -lt -le字符比较 ! -z -n文件判断 -f -d -L/-h -s -x逻辑判断 -a -o 正则匹配 [[ ~ ]]if单分支双分支多分支case菜单选择循环forwhile死循环读取文件循环控制continue 退出当前循环进入下一次循环break 退出循环exit 退出脚本return 退出当前函数函数格式函数传参$n , $0 , $# , $* , $ , $?颜色数组目标自动化与定时任务配合定时检查定时备份xxx部署服务脚本一般先手动部署根据流程书写脚本服务检查脚本服务管理脚本大脚本巡检脚本服务安装脚本优化脚本安全检查脚本安全加固等保加固