shell运维脚本优化

我们在平常工作中,你是否感觉shell脚本只是命令的堆砌;很多时候只是为了实现功能而没有好的组织结构;自己的脚本都不想再看一遍;此让你的shell脚本有python一样的美感并且极易维护,真的是shell脚本写到停不下来。
现以k8s发版脚本为例,看一下脚本的优化过程:
脚本执行需要传参数:
root@portal:/home/centos/build# ./release.sh test all-link-platform_all-link-process
#!/bin/bash set -eu ns=$1 project_name=$(echo $2|awk -F '_' '{print $2}') modul_name=$(echo $2|awk -F '_' '{print $3}') image_tag=harbor.example.cn:32443/jenkins-$ns/$project_name/$modul_name:$ns_$(date +%y%m%d%H%M)_manual_$project_name_$modul_name # 1. 构建镜像 docker build -t $image_tag -f jarFile . # 2. 检查镜像 result=$(docker images|grep $tag) if [[ $result == '' ]]; then echo "镜像不存在,请检查!" exit 1 fi # 3. 上传镜像然后删除本地镜像 docker push $image_tag && docker rmi $image_tag # 4. 更新deployment镜像 kubectl patch deployment $ns-$project_name-$modul_name -n $ns --patch "{\"spec\": {\"template\": {\"spec\": {\"containers\": [{\"name\": \"$ns-$project_name-$modul_name\",\"image\":\"$image_tag\"}]}}}}"
其实我这个脚本因为功能不是很多,所以看起来还算清晰。但要是那种上百行从上到下的shell脚本,那要理清楚逻辑就是很痛苦的事情了。
下面是优化后的脚本
#!/bin/bash set -eu baseName=`basename $0` current=$(date +%y%m%d%H%M) project_name=$(echo $2|awk -F '_' '{print $1}') modul_name=$(echo $2|awk -F '_' '{print $2}') image_tag=harbor.example.cn:32443/jenkins-$ns/$project_name/$modul_name:"$ns"_"$current"_"$project_name"_"$modul_name" function print_log() { log_level=$1 log_msg=$2 currentTime=`echo $(date +%F%n%T)` echo "$currentTime [$log_level] $log_msg" } function print_usage() { print_log "INFO" "Usage: $baseName namespace projectName_moduleName" print_log "INFO" "Example:" print_log "INFO" " $baseName test industry-platform_auth" } function build_image() { docker build -t $image_tag -f jarFile . } function check_image() { result=docker images | grep $current if [[$result == '']]; then print_log "ERROR" "Image not found,please check!" exit 1 fi } function pr_image() { docker push $image_tag && docker rmi $image_tag } function update_deploy() { kubectl patch deployment $ns-$project_name-$modul_name -n $ns --patch "{\"spec\": {\"template\": {\"spec\": {\"containers\": [{\"name\": \"$ns-$project_name-$modul_name\",\"image\":\"$image_tag\"}]}}}}" } function main() { if [ $# -ne 2 ]; then print_log "ERROR" "Exactly three parameter is required." print_usage return 1 fi build_image check_image pr_image update_deploy } ######################## ### 主程序逻辑 ### ######################## main "$@
优化过后代码好像还变复杂了,手动狗头。。。 其实仔细看的话结构还是很清晰的,上面也讲了是因为功能比较简单,就体现不出优势了。
上面脚本中有个日志打印的函数,是我从腾讯一位大佬的脚本中学到的,我觉得这个很棒,所以硬加进去了,哈哈哈。
参考连接: https://www.jianshu.com/p/121afeea78fc
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了