相信大家经常通过shell 脚本来做很多事情,今天分享10个实战与面试【常用Shell脚本】编写。
注意事项
1)开头加解释器:#!/ bin / bash
2)语法缩进,使用四个空格;多加注释说明。
3)命名建议规则:变量名大写,局部变量小写,函数名小写,名字体现出实际作用。
4)变量变量是变量的,在函数中变量local指定为局部变量,避免污染其他作用域。
5)有两个命令能帮助我调试脚本:set -e遇到执行非0时退出脚本,set-x打印执行过程。
6)写脚本一定先测试再到生产上。
1获取随机字符串或数字
获取随机8位字符串:
方法1:
#echo $ RANDOM | md5sum | cut -c 1-8
471b94f2
方法2:
#openssl rand -base64 4
vg3BEg ==
方法3:#cat
/ proc / sys / kernel / random / uuid | cut -c 1- 8
ed9e032c
获取随机8位数字:
方法1:
#回声$ RANDOM |校验和|切-c 1-8 23648321 方法2: # OpenSSL的兰特-base64 4 |校验和|切-c 1-8 38571131 方法3: # 日期+%N |切-c 1- 8 69024815
cksum:打印CRC效验和统计字节
2定义一个颜色输出字符串函数
方法1:
function echo_color(){
if [ $ 1 == “ green” ]; 然后
回显 -e “ [32; 40m $ 2 [0m]
elif [ $ 1 == ” red“ ]; 然后
echo -e “ [31; 40m $ 2 [0m”
fi
}
方法2:
function echo_color(){
case $ 1 in
green)
echo -e “ [32; 40m $ 2 [0m”
;;
红色)
echo -e “ [31; 40m $ 2 [0m]”
;
*)
echo “示例:echo_color red string”
esac
}
使用方法:echo_color green “ test”
function关键字定义一个函数,可加或不加。
3批量创建用户
#!/ bin / bash
DATE = $(date +%F_%T)
USER_FILE = user.txt
echo_color(){
如果 [ $ 1 == “ green” ]; 然后
回显 -e “ [32; 40m $ 2 [0m]
elif [ $ 1 == ” red“ ]; 然后
回显 -e “ [31; 40m $ 2 [0m”
fi
}
#如果用户文件存在并且大小大于0就备份
if [-s $ USER_FILE ]; 然后
mv $ USER_FILE $ {USER_FILE} - $ {DATE} .bak
echo_color green “$ USER_FILE 存在,重命名 $ {USER_FILE} - $ {DATE} .bak“
fi
echo -e ” User Password“ >> $ USER_FILE
echo ” ----------------“ >> $ USER_FILE
为 用户 在 用户{1..10}; 这样做
,如果 ID! $ USER &>的/ dev / null的, 则
PASS = $(回声 $ RANDOM |的md5sum |切-c 1-8)
useradd的 $ USER
回声 $ PASS | passwd --stdin $ USER &> / dev / null
echo -e “$ USER $ PASS“ >> $ USER_FILE
echo ” $ USER 用户创建成功。“
否则
echo_color红色 ” $ USER 用户已经存在!“
fi
完成
4检查双面是否安装
#!/ bin / bash
如果 rpm -q sysstat&> / dev / null; 然后
回显 “ sysstat已安装”。
否则,
回显 “未安装sysstat!”
科幻
5检查服务状态
#!/ bin / bash
PORT_C = $(ss -anu | grep -c 123)
PS_C = $(ps -ef | grep ntpd | grep -vc grep)
if [ $ PORT_C -eq 0 -o $ PS_C -eq 0] ; 然后
回显 “内容” | 邮件-s “主题” dst@example.com
fi
6检查主机存活状态
方法1:将错误IP放到并发症里面判断是否失败
#!/斌/庆典
IP_LIST = “192.168.18.1 192.168.1.1 192.168.18.2”
的 IP 在 $ IP_LIST ; 在 [ $ NUM -le 3] 时执行
NUM = 1 ; 这样做,如果 平-c 1 $ IP >的/ dev / null的; 然后回显“ $ IP Ping成功。” 中断else #echo“ $ IP Ping失败$ NUM” FAIL_COUNT [ $ NUM ] = $ IP 如果 [ $ {#FAIL_COUNT [*]} -eq 3] 使 NUM ++ fi 完成;然后回声“
$ {FAIL_COUNT [1]} Ping失败!”未
设置 FAIL_COUNT [*]
fi
完成
方法2:将错误次数放到FAIL_COUNT变量里面判断是否ping失败三次
#!/斌/庆典
IP_LIST = “192.168.18.1 192.168.1.1 192.168.18.2”
的 IP 在 $ IP_LIST ; 为 ((i = 1; i <= 3; i ++))做
FAIL_COUNT = 0 ; 如果 ping -c 1 $ IP > / dev / null,该怎么办? 然后回显“ $ IP Ping成功。” 打破别人#回声“$ IP Ping是失败$ I” 让 FAIL_COUNT ++ 网络完成,如果 [ $ FAIL_COUNT -eq 3]。 然后回显“ $ IP Ping失败!” 连接完成
方法3:利用为循环将ping通就就跳出循环继续,如果不跳出就会走到打印ping失败
#!/ bin / bash
ping_success_status(){
如果 ping -c 1 $ IP > / dev / null; 然后
回显 “ $ IP Ping成功。”
继续
科幻
}
IP_LIST = “192.168.18.1 192.168.1.1 192.168.18.2”
的 IP 在 $ IP_LIST ; 做
ping_success_status
ping_success_status
ping_success_status
回声 “ $ IP 平就是失败!”
做完了
7监控CPU,内存和硬盘利用率
1)CPU
通过vmstat工具来分析CPU统计信息。
#!/ bin / bash
DATE = $(date +%F “”%H:%M)
IP = $(ifconfig eth0 | awk -F [:] + / inet addr / {print $ 4}) #只支持CentOS6
邮件= “ example@mail.com”,
如果 ! 哪个 vmstat&> / dev / null; 然后
回显 “找不到vmstat命令,请安装procps软件包。”
退出 1
fi
US = $(vmstat | awk NR == 3 {print $ 13})
SY = $(vmstat | awk NR == 3 {print $ 14})
IDLE = $(vmstat | awk NR == 3 {print $ 15})
WAIT = $(vmstat | awk NR == 3 {print $ 16})
USE = $(($ US+ $ SY))
如果 [ $ USE -ge 50]; 然后
回显 “
日期: $ DATE
主机: $ IP
问题:CPU利用率 $ USE
” | 邮件-s “ CPU Monitor” $ MAIL
fi
2)内存
#!/ bin / bash
DATE = $(date +%F “”%H:%M)
IP = $(ifconfig eth0 | awk -F [:] + / inet addr / {print $ 4})
MAIL = “ example @ mail.com”
TOTAL = $(免费-m | AWK / MEM / {$打印2} )
USE = $(免费-m | AWK / MEM / {$打印3- $ $ 6- 7} )
FREE = $(($ TOTAL - $ USE))
#内存小于1G发送报警邮件
if [ $ FREE -lt 1024]; 然后
回显 “
日期: $ DATE
主机: $ IP
问题:总计= $ TOTAL,使用= $ USE,免费= $ FREE
“ |邮件-s ”内存监视器“ $ MAIL
fi
3)硬盘
#!/ bin / bash
DATE = $(date +%F “”%H:%M)
IP = $(ifconfig eth0 | awk -F [:] + / inet addr / {print $ 4})
MAIL = “ example @ mail.com“
TOTAL = $(fdisk -l | awk -F [:] + BEGIN {OFS =” =“} / ^ Disk / dev / {printf”%s =%sG,“,$ 2,$ 3})
PART_USE = $(DF -h | AWK BEGIN {OFS = “=”} / ^的/ dev / {打印$ 1,INT($ 5),$ 6} )
为 我 在 $ PART_USE ; 做
PART = $(echo $ i | cut -d “ =” -f1)
USE = $(echo $ i | cut -d “ =”
$ i | cut -d “ =” -f3)
如果 [ $ USE -gt 80]; 然后
回显 “
日期: $ DATE
主机: $ IP
总计: $ TOTAL
问题: $ PART = $ USE($ MOUNT)
” | 邮件-s “磁盘监视器” $ MAIL
fi
完成
8批量主机磁盘最大化监控
最初的监控端和被监控端SSH免交互登录或密钥登录。
写一个配置文件保存被监控主机SSH连接信息,文件内容格式:IP用户端口
#!/ bin / bash
HOST_INFO = host.info
for IP in $(awk / ^ [^#] / {print $ 1} $ HOST_INFO); 做
USER = $(awk -v ip = $ IP ip == $ 1 {print $ 2} $ HOST_INFO)
PORT = $(awk -v ip = $ IP ip == $ 1 {print $ 3} $ HOST_INFO)
TMP_FILE = / tmp / disk.tmp
SSH -p $ PORT $ USER @ $ IP DF -h > $ TMP_FILE
USE_RATE_LIST = $(AWK BEGIN {OFS = “=”} / ^的/ dev / {打印$ 1,INT($ 5)} $ TMP_FILE)
为 USE_RATE 在 $ USE_RATE_LIST ; 如果 [ $ USE_RATE -ge 80],则执行
PART_NAME = $ {USE_RATE%= *}
USE_RATE = $ {USE_RATE#* =}; 然后回显“警告: $ PART_NAME 分区使用情况 $ USE_RATE%!” 科幻完成完成
9检查网站可用性
1)检查URL可用
方法1:
check_url(){
HTTP_CODE = $(curl -o / dev / null --connect-timeout 3 -s -w “%{http_code}” $ 1)
如果 [ $ HTTP_CODE -ne 200]; 然后
回显 “警告: $ 1 访问失败!”
fi
}
方法2:
check_url(){
如果 !wget -T 10 --tries = 1 --spider $ 1 > / dev / null 2>&1; 复制代码 然后
#-T超时时间,-tries尝试1次,-spider爬虫模式
回声 “警告: $ 1 访问失败!”
fi
}
使用方法:check_url www.baidu.com
2)判断三次URL可用
思路与上面检查主机存活状态一样。
方法1:利用循环技巧,如果成功就跳出当前循环,否则执行到最后一行
#!/ bin / bash
check_url(){
HTTP_CODE = $(curl -o / dev / null --connect-timeout 3 -s -w 如果 [ $ HTTP_CODE -eq 200],则为“%{http_code}” $ 1); 然后继续科幻 } URL_LIST = “www.baidu.com www.agasgf.com” 的 URL 在$ URL_LIST ; do check_url $ URL check_url $ URL check_url $ URL echo “警告: $ URL 访问失败!” 做完了
方法2:错误次数保存到变量
#!/斌/庆典
URL_LIST = “www.baidu.com www.agasgf.com”
的 URL 在 $ URL_LIST ; 为 ((i = 1; i <= 3; i ++))做
FAIL_COUNT = 0 ; 如果 [ $ HTTP_CODE -ne 200],则执行 HTTP_CODE = $(curl -o / dev / null --connect-timeout 3 -s -w “%{http_code}” $ URL); 然后让 FAIL_COUNT ++ 别人休息网络完成,如果 [ $ FAIL_COUNT -eq 3]。 然后回显“警告: $ URL 访问失败!” 科幻
做完了
方法3:错误次数保存到数组
#!/斌/庆典
URL_LIST = “www.baidu.com www.agasgf.com”
的 URL 在 $ URL_LIST ; 在 [ $ NUM -le 3] 时执行
NUM = 1 ; 如果 [ $ HTTP_CODE -ne 200],则执行 HTTP_CODE = $(curl -o / dev / null --connect-timeout 3 -s -w “%{http_code}” $ URL); 然后 FAIL_COUNT [ $ NUM ] = $ IP #创建数组,以$ NUM下标,$ IP元素让 NUM ++ 别人休息网络完成,如果 [ $ {#FAIL_COUNT [*]}
-eq 3]; 然后
回显 “警告: $ URL 访问失败!”
未设置 FAIL_COUNT [*] #清空数组
网络
完成
10检查MySQL主从同步状态
#!/ bin / bash
USER = bak
PASSWD = 123456
IO_SQL_STATUS = $(mysql -u $ USER -p $ PASSWD -e show slave statusG | awk -F: / Slave _。* _ Running / {gsub(“:”,“: “); $打印0} ) #gsub去除冒号后面的空格
为 我 在 $ IO_SQL_STATUS ; DO
THREAD_STATUS_NAME = $ {I%:*}
THREAD_STATUS = $ {I#*:}
如果 [ “ $ THREAD_STATUS ” != “是” ]; 然后
回显 “错误:MySQL主从 $ THREAD_STATUS_NAME 状态为 $ THREAD_STATUS!”
连接
完成
本章写的Shell脚本示例都比较实用,在面试题中也经常出现,希望大家参考着多动手写写,不要复制粘贴就拿来跑,这样是学不会的!
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.