<强>对于初学者而言,因为没有实战经验,写不出来的Shell脚本很正常,如果工作了几年的运维老年还是写不出来,那就是没主动找需求,缺乏练习,缺乏经验针。对以上问题,总结了30个生产环境中经典的Shell脚本,通过这些需求案例,希望能帮助大家提升壳编写思路,掌握编写技巧。强>
<强>先了解下编写壳过程中注意事项:强>
<>以前开头加解释器:# !/bin/bash 语法缩进,使用四个空格;多加注释说明。 命名建议规则:变量名大写,局部变量小,写函数名小写,名字体现出实际作用。 默认变量是全局的,在函数中变量当地指定为局部变量,避免污染其他作用域。 有两个命令能帮助我调试脚本:设置- e遇到执行非0时退出脚本,集合x打印执行过程。 写脚本一定先测试再到生产上。<强> 1,获取随机字符串或数字强>
<>之前获取随机8位字符串: 方法1: # echo $随机md5sum | | - c 1 - 8 471年b94f2 方法2: # openssl兰德base64 4 vg3BEg==第三方法: #猫/proc/sys/kernel/random/uuid | - c 1 - 8 ed9e032c 获取随机8位数字: 方法1: # echo $随机|校验和| - c 1 - 8 23648321 方法2: # openssl兰德base64 4 |校验和| - c 1 - 8 38571131 第三方法: #日期+ % N | - c 1 - 8 69024815 校验和:打印CRC效验和统计字节<强> 2,定义一个颜色输出字符串函数强>
方法1: 函数echo_color () { 如果(1美元==奥躺?;然后 回声033 - e " \[32; 40米033美元\ [0 m” elif(1美元==昂焐?;然后 回声033 - e " \[31; 40米033美元\ [0 m” fi } 方法2: 函数echo_color () { 案例1美元 绿色) echo - e”[32; 40米2美元[0 m” ;; 红色) echo - e”[31; 40米2美元[0 m” ;; *) 回声”的例子:echo_color红色字符串” esac } 使用方法:echo_color绿色“测试” 函数关键字定义一个函数,可加或不加。
<强> 3批量创建用户强>
# !/bin/bash=$日期(日期+ % f % T) USER_FILE=. txt echo_color () { 如果(1美元==奥躺?;然后 echo - e”[32; 40米2美元[0 m” elif(1美元==昂焐?;然后 echo - e”[31; 40米2美元[0 m” fi } #如果用户文件存在并且大小大于0就备份 如果(- s USER_FILE美元);然后 mv USER_FILE {USER_FILE} -美元${日期}. bak echo_color绿色”USER_FILE美元存在,重命名{USER_FILE} -{日期}. bak美元” fi echo - e“用户密码”在祝辞USER_FILE美元 回声”- - - - - - - - - - - - - - - - -“在祝辞USER_FILE美元 为用户在用户{1 . . 10};做 如果!$ USER id,在/dev/null;然后 通过=$ (echo $随机md5sum | |削减- c 1 - 8) useradd $ USER 回声过去| passwd——stdin美元用户,在/dev/null echo - e“用户通过美元”在祝辞USER_FILE美元 回声“$ USER用户创建成功。” 其他的 echo_color红”$ USER用户已经存在!” fi 以前做><>强4、检查软件包是否安装强>
# !/bin/bash 如果rpm - q sysstat,在/dev/null;然后 回声“sysstat已经安装”。 其他的 回声“sysstat没有安装!” fi<强> 5,检查服务状态强>
# !/bin/bash PORT_C=$ (ss阿奴| grep - c 123) PS_C=$ (ps ef | grep ntpd | grep vc grep) 如果[$ PORT_C eq 0 - o $ PS_C eq 0];然后 回声”内容”|邮件- s”主题“dst@example.com fi<>强6日检查主机存活状态强>
方法1:将错误IP放到数组里面判断是否平失败三次 # !/bin/bash IP_LIST=" 192.168.18.1 192.168.1.1 192.168.18.2 " 对IP IP_LIST美元;做 NUM=1 而(NUM勒3美元);做 如果ping - c 1 $ IP祝辞/dev/null;然后 echo " $ IP Ping成功。” 打破 其他的 #回声“IP Ping失败NUM美元” FAIL_COUNT (NUM美元)=$ IP 让NUM + + fi 完成 如果($ {# FAIL_COUNT [*]} eq 3]; 回声“$ {FAIL_COUNT [1]} Ping失败!” 设置FAIL_COUNT [*] fi 完成 方法2:将错误次数放到FAIL_COUNT变量里面判断是否平失败三次 # !/bin/bash IP_LIST=" 192.168.18.1 192.168.1.1 192.168.18.2 " 对IP IP_LIST美元;做 FAIL_COUNT=0 ((我=1;i<=3;我+ +));做 如果ping - c 1 $ IP在/dev/null;然后 echo " $ IP Ping成功。” 打破 其他的 #回声“IP Ping失败我美元” 让FAIL_COUNT + + fi 完成 如果[$ FAIL_COUNT eq 3];然后 echo " $ IP Ping失败! " fi 完成 方法3:利用的循环将ping通就跳出循环继续,如果不跳出就会走到打印平失败 # !/bin/bash ping_success_status () { 如果ping - c 1 $ IP在/dev/null;然后 echo " $ IP Ping成功。” 继续 fi } 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 echo " $ IP Ping失败! " 以前做30个关于Shell脚本的经典案例(上)