尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Shell编程——开发规范

Shell编程——开发规范 开发规范1、Shell脚本基本规范2、Shell脚本变量命名及引用变量规范2.1、全局变量定义2.2、局部变量定义2.3、变量的引用规范3、Shell函数的命名及函数定义规范4、Shell脚本模块高级命名规范5、Shell脚本的代码风格5.1、代码框架5.2、缩进规范6、Shell脚本的变量及文件检查规范1、Shell脚本基本规范在Shell脚本里第一行通常用于指定脚本解释器该行内容为#! /bin/bash或#! /bin/sh而在Shell脚本的开头处解释器代码后最好加上版本版权等信息如下#Date: 16:29 2012-3-30#Author: Created by oldboy#Mail: 31333741qq.com#Function:This scripts function is.....#Version: 1.1说明可在修改/.vimrc配置文件时自动加上以上信息的功能。此项在Linux系统场景下不是必须的属于优秀规范和习惯。此外Shell脚本中尽量不要用中文注释应用英文注释以防止本机或切换系统环境后出现中文乱码的困扰。如果非要加中文请根据自身的客户端对系统进行字符集调整如export LANG“zh_CN.UTF-8”并在脚本中重新定义字符集使其和系统一致。Shell脚本命名应以“.sh”为扩展名。例如script-name.sh。Shell脚本应存放在固定的路径下例如/server/scripts。以下则是代码书写技巧。成对的符号应尽量一次写出来然后退格在符号里增加内容以防止遗漏。这些成对的符号包括{}、[]、、、中括号​[​]​两端至少要有1个空格因此键入中括号时即可留出空格[ ]​然后再退格键入中间的内容并确保两端都至少有一个空格。即先键入一对中括号然后退一个格输入两个空格再退一个格双中括号​[​[​]​]​的写法也是如此。对于流程控制语句应一次将格式写完再添加内容。比如if语句的格式一次完成应为if条件内容then内容fifor循环语句的格式一次完成应为fordo内容done提示while和until、case等语句也是一样。通过缩进让代码更易读比如if条件内容then内容fi字符串赋值给变量时应加双引号并且等号前后不能有空格。例如OLDBOY_FILEtest.txt脚本中的单引号、双引号及反引号必须为英文状态下的符号其实所有的Linux标准字符及符号都应该是英文状态下的符号这一点需要特别注意。2、Shell脚本变量命名及引用变量规范2.1、全局变量定义全局变量也称环境变量它的定义应全部大写如APACHE_ERR或APACHEERR名字对应的语义要尽量清晰能够正确表达变量内容的含义对于过长的英文单词可用前几个字符代替。多个单词间可用“_”号连接全局变量的定义一般放在系统的全局路径中并且最好采用export来定义全局变量一般可以在任意子Shell中直接使用特殊情况除外例如定时任务执行Shell时就最好在Shell里重新定义这些全局变量否则可能会出现问题​。范例全局变量的定义示例。[rootoldboy scripts]# tail -1 /etc/profileexportAPACHEERRhello[rootoldboy scripts]# source /etc/profile[rootoldboy scripts]# echo $APACHEERRhello2.2、局部变量定义局部变量也称为普通变量在常规脚本中普通变量的命名也要尽可能统一可以使用驼峰语法即第二个单词的首字母大写如oldboyTraining或者每个单词首字母大写如CheckUrl当然也有网友喜欢采用全部大写或全部小写的方式例如CHECK、check选一种适合你的即可或者跟着本书的规范走。Shell函数中的变量可以使用local方式进行定义使之只在本函数作用域内有效防止函数中的变量名称与外部程序中的变量相同从而造成程序异常。下面是在函数中定义变量的例子。范例实现函数内的变量定义。functionTestFunc(){localifor((i0;in;i))doechodo somethingdone}2.3、变量的引用规范在引用变量时若变量前后都有字符则需要使用A P A C H E E R R 加大括号的方式引用变量以防止产生歧义当变量内容为字符串时需要使用 {APACHE_ERR}加大括号的方式引用变量以防止产生歧义当变量内容为字符串时需要使用APACHEE​RR加大括号的方式引用变量以防止产生歧义当变量内容为字符串时需要使用{APACHE_ERR}外面加双引号的方式引用变量当变量内容为整数时则最好直接使用$APACHE_ERR来引用变量。全局变量、局部变量、函数变量、数组变量等都是如此。说明对于需要环境变量的Java程序脚本等在写脚本之前最好通过export重新声明环境变量以免在定时任务等场合的使用中出现问题。3、Shell函数的命名及函数定义规范Shell函数的命名可采用单词首字母大写的形式如CreateFile()并且语义要清晰比如使用CreateFile()代替CFile()也可以使用小写形式如createfile()。可以加前后缀如后缀为Max则为最大值为Min则表示最小值前缀Is为判断型函数Get为取值函数Do则为处理函数这也有益于对函数功能的理解使函数名更直观、更清晰。范例对操作系统函数库脚本的函数名进行定义。#/etc/init.d/functions# Check whether file $1 is a backup or rpm-generated file and should be ignoredis_ignored_file(){#这里系统的函数名并没有大写除了大小写之外还是比较规范的。case$1in|.bak|.orig|.rpmnew|.rpmorig|.rpmsave)return0;;esacreturn1}如果需要区别一些常规的字符串可在函数名前加上function关键字例如functionCreateFile(){}显示函数返回值时可在函数的结尾内容中包含return语句并跟上返回值。即使是不关心返回值的函数也可能在后续调用时无意识地去判断它的返回值并进行一系列动作使用return语句不会带来多少负担但确实能让函数的逻辑变得更加清晰和严谨。范例为操作系统函数库脚本函数定义return返回值。# Log a warningwarning(){localrc$?#if [ -z ${IN_INITLOG:-} ]; then# initlog $INITLOG_ARGS -n $0 -s $1 -e 1#fi[$BOOTUP!verbose-a-z${LSB:-}]echo_warningreturn$rc}4、Shell脚本模块高级命名规范1常规Shell脚本使用统一的后缀.sh例如oldboy.sh。2模块的启动和停止脚本统一命名为start_模块名sh和stop_模块名sh。3监控脚本通常以*_mon.sh为后缀。4控制脚本一般以*_ctl.sh为后缀。5、Shell脚本的代码风格5.1、代码框架易变的信息如报警的收件人、机器名、端口、用户名密码、URL等最好都定义为变量或使用特殊位置的参数这会使开发的脚本更具通用性。把Shell的通用变量以配置文件的形式单独存放以“功能cfg”来命名例如nginx.conf并放入conf目录下引用时通过在脚本开头使用source conf/nginx.conf的形式来加载。将程序的功能分段、分模块采用函数等来实现并存放到单独的函数文件里如果是通用的公共函数可以存放于/etc/init.d/functions下调用时采用source文件全路径即可。把脚本中的功能和配置明确分开主脚本只用于实现程序主干加载配置及加载函数等功能实现应尽量封装在子函数中。规范代码树如下。[rootoldboy scripts]# tree.|-- bin|-- ipsecctl|-- conf|-- ipsec.cfg-- func-- functions3directories,3files5.2、缩进规范在使用条件语句时每进行一层循环或是循环内部的操作时就使用一个缩进缩进一般用TAB键或加空格本书推荐采用4个空格缩进。范例写出脚本缩进规范。if[-doldboy_dir]thencdoldboy_dirif[-foldboy_file]thenechoDoSthficd..fi范例给出系统脚本函数的缩进示例。# Confirm whether we really want to run this serviceconfirm(){[-x/usr/bin/rhgb-client]/usr/bin/rhgb-client--detailsyeswhile:;doecho-n$Start service$1(Y)es/(N)o/(C)ontinue? [Y] readanswerifstrstr $yY$answer||[$answer];thenreturn0elifstrstr $cC$answer;thenrm-f/var/run/confirm[-x/usr/bin/rhgb-client]/usr/bin/rhgb-client--detailsnoreturn2elifstrstr $nN$answer;thenreturn1fidone}提示可调整vim实现自动缩进建议缩进4个空格。6、Shell脚本的变量及文件检查规范脚本中要检查配置项是否为空、是否可执行等尤其是对于一些重要的、会影响下面脚本正常运行的配置项必须要进行是否为空等的检查避免配置文件中出现遗漏等问题。范例针对字符串变量进行判断。if[-n${FILE_PATH}]thenechoDo somethingfi范例给出HTTP脚本变量的定义方式。httpd${HTTPD-/usr/sbin/httpd}proghttpdpidfile${PIDFILE-/var/run/httpd.pid}lockfile${LOCKFILE-/var/lock/subsys/httpd}
返回列表