怎么写shell脚本才能不耍流氓?
1、不记录日志的 SHELL 脚本就是耍流氓!
我们经常在工作中会遇到一个苦恼的事情,一个 Shell 脚本到底干了什么,什么时候开始执行,什么时候结束的。尤其是数据库备份,我们想知道我们的 MySQL 数据库备份时间。所以给脚本加日志显得尤为重要。那么我们的脚本应该有一个日志的函数,专门用于记录日志:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #!/bin/bash SHELL_NAME= "$0" SHELL_LOG= "/var/log/$SHELL_NAME.log" shell_log(){ log_info=$1 echo "`date '+%H:%M:%S'` : $SHELL_NAME $log_info" >> $SHELL_LOG } shell_log "script start excupt......." sleep 3 shell_log "shell success........." # 上面的脚本我编写了一个日志函数shell_log,每次记录日志,我们直接执行shell_log把日志内容 当作第一个参数传给它就可以了,赶紧试试。 [root@zabbix_server /mnt ] # cat /var/log/mysql.sh.log 06:18:33 : mysql.sh script start excupt....... 06:18:36 : mysql.sh shell success......... |
2、直接就能执行的Shell脚本很容易耍流氓?
一个脚本直接就能执行?难道不是直接就能执行吗?试想,你临时编写了一个特别重要的脚本,干的事情可能有破坏性,一不小心被别人./执行了怎么办呢?而且很多时候我们一个脚本的功能可能有多个,所以我们有必要让用户可以选择进行执行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | #!/bin/bash # Shell Env SHELL_NAME= "shell_template.sh" SHELL_DIR= "/opt/shell" SHELL_LOG= "${SHELL_DIR}/${SHELL_NAME}.log" LOCK_FILE= "/tmp/${SHELL_NAME}.lock" #Write Log shell_log(){ LOG_INFO=$1 echo "$(date " +%Y-%m-%d ") $(date " +%H-%M-%S ") : ${SHELL_NAME} : ${LOG_INFO}" >> ${SHELL_LOG} } # Shell Usage shell_usage(){ echo $ "Usage: $0 {backup}" } # Backup MySQL All Database with mysqldump or innobackupex mysql_backup(){ shell_log "mysql backup start" shell_log "mysql backup stop" } # Main Function main(){ case $1 in backup) mysql_backup ;; *) shell_usage; esac } #Exec main $1 # 上面的脚本我们编写了shell_usage函数,用来告诉用户,这个脚本的使用方法。同时,我要强调一下 ,像编写Shell, 我们经常是面向过程的,建议以函数为单位,这样脚本非常的清晰可读。赶紧执行以下 看看效果吧。 [root@zabbix_server /mnt ] # sh mysql.sh Usage: mysql.sh {backup} |
对于一个功能脚本来说,貌似还少了点什么。对,就是注释!我们要说明白这个脚本是干啥的。或者以后你离职后,别人看到这个脚本之后,我擦,这么牛掰的脚本是谁写的呢?不要怕,写上你的大名。
1 2 3 4 5 6 7 8 9 | ################################## # $Name: shell_template.sh # $Version: v1.0 # $Function: Backup MySQL Databases Template Script # $Author: Jason Zhao # $organization: https://www.unixhot.com/ # $Create Date: 2016-08-27 # $Description: You know what i mean,hehe ################################### |
当然还有很多编写脚本的技巧,没法一一描述,不过如果能掌握上面的三种技巧,立马感觉编写的脚本有点高大上,有木有?
本文转自 运维小学生 51CTO博客,原文链接:http://blog.51cto.com/yasar/1880949,如需转载请自行联系原作者
相关文章:

透过腾讯张潼离职事件,看AI研究院如何才算成功?
作者 | 洪亮劼编辑 | 琥珀【AI科技大本营导读】近日腾讯 AI Lab 第一负责人张潼博士的离职事件,让不少圈内人士对企业 AI 研究院/实验室的定位、落地能力等问题进行了深刻思考和讨论。据最新消息,张潼未来将回到学界,继续 AI 领域的学术研究&…

java vs .net
... vs paramsjavaprivatestaticintsumUp(int... values) { intsum 0; for(inti 0; i < values.length; i) { sum values[i]; } returnsum; } .netparams 关键字在方法成员的参数列表中使用,为该方法提供了参数个数可变的能力它在只能出现一次并…

#QCon# Devops
今天参加了QCon2011 杭州。听了百度项目管理部的乔梁关于“Devops”的分享。比如如下: continuous integration —— Dev , QA agile —— Business,Dev,QA devops —— Dev,QA,Ops Devops Culture Too…

雷军的100亿计划:不服就干,生死看淡
图片来自小米官网整理 | 琥珀出品 | AI 科技大本营1 月 10 日,红米品牌正式独立。11 日,雷军在小米年会上宣布,2019 年,小米将正式启动“手机AIoT”双引擎战略,作为小米未来五年的核心战略。同时,未来 5 年…

cppcheck源码学习(一)
今天整理了下cppcheck的源码结构,为什么通过写一个个子文件就能够扩展cppcheck的功能呢? 看了下代码,并通过简化代码,略懂一二了。 首先我们定义一个基类test.h,只定义一个头文件足够: #ifndef TESTH #defi…

产品与技术优势发威 用友U9截击SAP ORACLE
随着金融危机的全面爆发,实体经济的冬天也随之而来。也正是金融危机,使得多年以来一直高调占据媒体头条的管理软件厂商们略显低迷,使一直剑拔弩张的中国管理软件市场,进而升级为一场“血腥四溅的肉搏”。<?xml:namespace pref…

oracle中的exists 和 not exists 用法详解
from:http://blog.sina.com.cn/s/blog_601d1ce30100cyrb.htmloracle中的exists 和 not exists 用法详解 (2009-05-14 16:58:18) 有两个简单例子,以说明 “exists”和“in”的效率问题1) select * from T1 where exists(select 1 from T2 where T1.aT2.a)…

清华北大“世界排名断崖式下跌”?
作者 | 琥珀出品 | AI 科技大本营为什么人们疯狂地爱着排名?基本每过一年公布的全球大学排行榜,都会吸引不少的利益相关方甚至吃瓜群众的集体关注。每每此时,网络上泛滥着的却是眼花缭乱、无法令人辨别真假的数字依据,甚至是“专家…

#Qcon# 分享
明天被领导要求分享Qcon体会,实在是件不怎么容易的事情。Qcon这样的企业开发大会,很多东西必须要实际应用过才能深有体会,泛泛的谈似乎又觉得乏味。好吧,泛一下就泛一下吧,总比废话要强(上一句是我认为的废话)。 第二天…

判断一个数为多少位 比如 3 是 1位 102 是3位。
12345678910111213141516//判断一个数为多少位 比如 3 是 1位 102 是3位。#include <iostream>using namespace std; int main() {int a; cout<<"input a num"<<endl; cin>>a; int t1; for(int i10;i<10000000;i*10,t) if(a<i) brea…

完成CitrixVDI架构了解及部署测试
很是不错,经过近两周时间对CitrixVDI架构的学习,有了初步的了解和认识,同时,也在家中完成了整个体系的部署实验。由于公司正在使用着VMware的VDI(Viewe3.0),又在测试CitrixVDI,使两者终于有了直接的对比&am…

keepalive
高可用解决方案: heartbeat corosync cman keepalived 前面我们讲解了,LVS(负载均衡器)、Heartbeat、Corosync、Pacemaker、Web高可用集群、MySQL高可用集群、DRDB、iscsi、gfs2、cLVM等,唯一没有讲解的就是LVS可用&a…

普元王葱权:数字化时代需要新一代的大数据应用平台架构
记者 | 杨丽出品 | AI 科技大本营(rgznai100)2018 年 12 月 6 日,北京新云南皇冠假日酒店,由中国计算机学会主办,CCF 大数据专家委员会承办,CSDN、中科天玑数据科技股份有限公司协办的 2018 中国大数据技术…

Agile DSL Development in Ruby 笔记
pdf见:http://obiefernandez.com/presentations/obie_fernandez-agile_dsl_development_in_ruby.pdf 1. What is DSL ——designed for a specific domain ——captures jargon in executable form ——can be internal or external 2. How to design Ruby DSL (…

人生的出口。在哪
清晨,雨停了。到处都是滴滴答答的雨滴声。似乎这场空洞漫长的过程一直在延续着。也不知道是为什么。在下完雨之后。自己的心情会特别的低落沉重。似乎经历了一场浩劫。没有太多的言语可以去描述。只有自己内心乏味的明白那些含义深刻的东西。约了好友。我迟到了十多…

zabbix专题:第十一章 zabbix之SNMP方式监控
(SNMP基本都是监控网络设备,本文介绍点理论知识) 概述 如果我们需要监控打印机、路由器、UPS等设备,肯定不能使用zabbix agentd,因为他们不能安装软件的,还好他们一般都支持SNMP协议,这样我可以使用SNMP来监控他们.如果你希望使用SNMP agent来…

Some Rules from wrting your own dsl with ruby
来自:http://blog.nofail.de/2010/02/writing-your-own-dsl-with-ruby/ Some Rules from wrting your own dsl with ruby 1. let the user choose how to use it all implemented methods return the object instance itself,so one can chain method calls for con…

免费报名 | 微软全双工语音对话以及在智能硬件上的应用
微软小冰第六代发布会上正式宣布上线全新的共感模型,同时也开始公测一种融合了文本、全双工语音与实时视觉的新感官。这项新技术可以实时预测人类即将说出的内容,实时生成回应,并控制对话节奏,从而使长程语音交互成为可能。而采用…

文件服务器迁移
不论大小,几乎每个公司都有自己的文件服务器,或者简单点的共享文件夹。随着数据的爆炸式增长,以及天长日久累积下来,数据量往往在一年两之后就超出服务器的容量。要解决这个问题,首先当然是做好数据管理,用…

Windows脚本初探之PowerShell流程控制if
Windows Powershell中if语句为可以为一下三种形式,只用表达式为True时才执行相应花括号中的命令语句/块: 示例1: 1234if (表达式1) { 命令语句/块1 } 示例2: 12345678if (表达式1) { 命令语句/块1 } else{ 命令语句/块2 } 示例3&a…

“万人迷”小冰背后的AI故事
作者 | Jane出品 | AI科技大本营从 2014 年的夏天小冰出现在我们的视野到今天,谈到小冰,你的第一印象是什么?一款可爱、萌萌哒的聊天机器人?一款随时在你身边,可以帮你做一些场景任务的语音助手?如果说&…

开放式Android联盟成立
在Google采取行动反对CyanogenMod项目的几天之后,提供了定制的Android固件。一组Android开发者成立了开发式Android联盟。根据项目的网站介绍,这个联盟是‘pro-Android’而不是‘anti-Google’。他们的目的取代封闭的源代码,专有的应用程序包…

QQ卖手办,用AI分析用户评论
作者 | 徐汉彬指导 | 宋彦编辑 | Jane出品 | AI科技大本营徐汉彬,腾讯鹅漫前台研发团队 Leader,T3-3 级工程师,负责鹅漫U品和 AMS 平台(高峰期 PV 超过 13 亿)的研发工作,在 Web 研发、活动运营服务领域有丰…

使用svn时碰到的一个的问题
做技术的人,需要有完美主义,很多问题,如果当时不能彻底解决,往往会留下更大的麻烦。这个字符编码的问题,当时碰到的时候没有主义,以后遇到的时候也是抱着躲避的鸵鸟主义的态度,今天认真对待了一…

远程为服务器安装Windows 2008 Server
命苦,老早就定好10.1期间要把服务器重新安装一次,今天反正也没有事情,来尝试下远程安装,因为以后的MOSS公司要远程的管理和使用 先登录到远程控制卡的管理地址 然后输入用户名和密码,以下是登录成功后的界面 然后在左侧的功能树中选择“介质”…

Spring装配Bean---使用xml配置
声明Bean Spring配置文件的根元素是<beans>. 在<beans>元素内,你可以放所有的Spring配置信息,包括<bean>元素的声明. 除了Beans命名空间,Spring的核心框架总共自带了10个命名空间配置: 命名空间用途 aop 为声…

Ruby DSL介绍及其在测试数据构造中的使用(1)
什么是DSL?英文全称Domain Specific Language,中文解释为领域专用语言。顾名思义,DSL是针对某个特定领域而开发的语言。像我们平时接触到的C/C,Java,Python/Ruby,都属于通用语言,可以为各个领域…

2017年度最受欢迎开源中国项目:roncoo-pay投票评选
2019独角兽企业重金招聘Python工程师标准>>> roncoo-pay项目正在参加 2017年度最受欢迎中国开源软件评选,请大家投上宝贵的一票,支持roncoo-pay更好的发展,为大家带来更多好用的支付功能! 2017年度最受欢迎中国开源软件…

编程小问题系列(2)——为什么WPF里MediaElement等视频控件不起作用
为什么WPF里MediaElement等视频控件不起作用?非常可能的原因是因为没有安装Microsoft Windows Media Player 10或者10以上的播放器,MSDN文档里就写有下面一句话:Both and are used to present audio, video, and video with audio content. B…

国行版HomePod售价2799元,本周五发售
(图片源自苹果中国官网截图)整理 | 一一出品 | AI科技大本营去年 12 月,苹果表示将于今年年初在中国销售其 HomePod 智能音箱。1 月 14 日,苹果公司正式宣布,HomePod 将于 1 月 18 日(本周五)在…