Shell脚本规范

    良好的代码规范不仅方便阅读,也利于维护和提升开发效率。因此建议大家在编写Shell脚本时养成良好的代码习惯。今天就和大家探讨一下在Shell脚本中的一些规范,详细如下所示:

  • 1、在Shell脚本中,第一行指定脚本解释器,如下所示:
#!/bin/bash

#!/bin/sh
  • 2、在Shell脚本中填写代码作者、日期、版权等信息,便于协同开发
  • 3、Shell脚本中的注释,尽量采用英文注释,避免中文注释,可避免本机或切换系统环境后出现乱码,如果必须采用中文,建议按在脚本中添加以下环境变量
export LANG="zh_CN.UTF-8"
  • 4、脚本命名需要简洁明了且以.sh作为扩展名
  • 5、脚本尽量存放在固定的路径中,便于查找、调用和维护
  • 6、代码编写技巧如下所示:
> a):成对的符号尽量一次书写完整,而后再向里面添加内容,这样可以避免遗漏符号。
如 {} [] '' " " ``
> b):[ ]和[[ ]] 两端至少要留有一个空格
> c):对于if/for/while/select/case 等应一次将格式写完,而后再添加对应的处理语句
> d):代码中应注意缩进,便于阅读,可使用TAB或空格,一般建议采用空格键进行缩进
> e):字符串赋值给变量应加双引号("")并且等号前后不能有空格
如 str="Test"
> f):脚本中的书写必须为英文状态下的符号、字母等。
  • 7、全局变量(环境变量)的定义需要全部大写,其名称需要一看便知其意,定义需要使用export
  • 8、局部变量(普通变量)命名需要遵循一定的命名规则,如驼峰语法;风格要统一
  • 9、Shell函数中的变量可以使用local方式进行定义,使之仅在该函数体内有效,从而避免与外部程序的变量相同,造成程序异常
[root@localhost Test]# cat local.sh
#!/bin/bash
function Test () {
local i # 定义本地变量,仅在函数体内有效
for((i=0;i<5;i++))
do
echo "in function i is:" ${i}
done
}
Test
i=100
echo "not in function i is:"${i}
[root@localhost Test]# bash local.sh
in function i is: 0
in function i is: 1
in function i is: 2
in function i is: 3
in function i is: 4
not in function i is:100
  • 10、在引用变量时,若变量前后都有字符,则需要使用${variable}进行引用,避免产生歧义;当变量为字符串时,需要使用"${variable}"进行引用;当变量为整数时,则可以直接使用$variable进行引用。
  • 11、对于一些经常变化的信息,建议采用变量或位置参数等进行定义和使用。
  • 12、脚本中要检查配置项是否为空,是否可执行等,增加脚本的健壮性。

Shell脚本调试

    相比于其他编程语言,Shell脚本没有专门的IDE去进行各类细致的调试。但我们可以通过运行Shell脚本的错误提示和打印信息来进行排错和纠错。

常见错误示例

  • 1、if语句缺少结尾关键字
[root@localhost Test]# cat -n testif.sh
1 #!/bin/bash
2 if [ -f /root/Test/a.sh ]
3 then
4 echo "/root/Test/a.sh exist"
5 else
6 echo "/root/Test/a.sh no exist" # 缺少fi
[root@localhost Test]# bash testif.sh
testif.sh:行7: 语法错误: 未预期的文件结尾

在上面提示中,显示第7行存在错误,依据该提示,我们可以仔细观察错误提示的前后,应该不难找出错误。

在运行Shell脚本出现错误后,不能单看提示的错误行,需要结合提示行前后进行排错。Shell不会对脚本错误进行精确定位,这个也是区别于其他语言的地方。
  • 2、循环语句中缺少关键字或关键字拼写不正确
[root@localhost Test]# cat -n testif.sh
1 #!/bin/bash
2 while
3 do
4 if [ -f /root/Test/a.sh ]
5 then
6 echo "/root/Test/a.sh exist"
7 else
8 echo "/root/Test/a.sh no exist" # 结尾少了done
[root@localhost Test]# bash testif.sh
testif.sh:行3: 未预期的符号 `do' 附近有语法错误
testif.sh:行3: ` do'
  • 3、成对的符号落了单
[root@localhost Test]# cat -n testif.sh
1 #!/bin/bash
2 #while
3 #do
4 if [ -f /root/Test/a.sh # 缺少 ]
5 then
6 echo "/root/Test/a.sh exist"
7 else
8 echo "/root/Test/a.sh no exist"
9 fi
[root@localhost Test]# bash testif.sh
testif.sh: 第 4 行:[: 缺少 `]'
/root/Test/a.sh no exist
  • 4、[]和[[]]两端缺少空格
[root@localhost Test]# cat testif.sh
#!/bin/bash
#while
#do
if [-f /root/Test/a.sh] # [] 两端没有空格
then
echo "/root/Test/a.sh exist"
else
echo "/root/Test/a.sh no exist"
fi
[root@localhost Test]# bash testif.sh
testif.sh:行4: [-f: 未找到命令

Shell调试技巧

  • 1、Windows中编写脚本明明语法什么均正确,在Linux中跟却提示各种语法错误,这种情况建议优先在Linux写脚本。因为Windows中和格式与Linux格式还是有很多差异的。
  • 2、在代码关键地方打印日志,如使用echo
  • 3、使用bash命令参数调试,常用调试参数如下所示:
> -n : 不执行脚本仅检查脚本语法是否存在错误
> -v : 先将脚本内容显示到屏幕再执行执行脚本
> -x : 将执行脚本的内容及输出全部显示到屏幕上

以上参数示例如下,所示:

-n参数示例:

[root@localhost Test]# cat -n testif.sh
1 #!/bin/bash
2 #while
3 #do
4 if [ -f /root/Test/a.sh ]
5 then
6 echo "/root/Test/a.sh exist"
7 else
8 echo "/root/Test/a.sh no exist"
9 # 缺少结束标志 fi
[root@localhost Test]# bash -n testif.sh
testif.sh:行10: 语法错误: 未预期的文件结尾

-v参数示例:

[root@localhost Test]# bash -v testif.sh # 显示脚本内容并执行脚本
#!/bin/bash
#while
#do
if [ -f /root/Test/a.sh ]
then
echo "/root/Test/a.sh exist"
else
echo "/root/Test/a.sh no exist"
fi
/root/Test/a.sh no exist # 脚本执行结果

-x参数示例:

[root@localhost Test]# cat -n sum.sh
1 #!/bin/bash
2 function Sum () {
3 for((i=1;i<=$1;i++))
4 do
5 ((sum=sum+i))
6 echo "{1..$1} sum is :" ${sum}
7 done
8 }
9
10 Sum $1
11 if [ $? == "0" ]
12 then
13 echo "Completed"
14 else
15 echo "Error"
16 fi
[root@localhost Test]# bash -x sum.sh 5
+ Sum 5
+ (( i=1 ))
+ (( i<=5 ))
+ (( sum=sum+i ))
+ echo '{1..5} sum is :' 1
{1..5} sum is : 1
+ (( i++ ))
+ (( i<=5 ))
+ (( sum=sum+i ))
+ echo '{1..5} sum is :' 3
{1..5} sum is : 3
+ (( i++ ))
+ (( i<=5 ))
+ (( sum=sum+i ))
+ echo '{1..5} sum is :' 6
{1..5} sum is : 6
+ (( i++ ))
+ (( i<=5 ))
+ (( sum=sum+i ))
+ echo '{1..5} sum is :' 10
{1..5} sum is : 10
+ (( i++ ))
+ (( i<=5 ))
+ (( sum=sum+i ))
+ echo '{1..5} sum is :' 15
{1..5} sum is : 15
+ (( i++ ))
+ (( i<=5 ))
+ '[' 0 == 0 ']'
+ echo Completed
Completed

前面带有"+"表示执行的过程语句,没有带"+"则表示输出的结果,通过-x参数可以查看整个执行的过程中每一步

Shell调试总结

  • 1、如果在Windows中编写的脚本在Linux中无法运行时,可使用工具dos2unix或Notepad++转换为Linux格式
  • 2、Shell脚本运行中的报错并不像其他高级语言一样详细,在排错时需要结合前后代码段进行排查纠错
  • 3、在调试中可使用bash自带的参数进行调试定位问题点
  • 4、平时养成良好的代码习惯和规范,可以规避部分常识性的错误

    Shell编程基础篇到此已经介绍完毕。本系列也仅仅入门系统,如果还要继续深入学习,还需要多看看别人优秀的代码,做到多看多练,方能更进一步。

本文同步在微信订阅号上发布,如各位小伙伴们喜欢我的文章,也可以关注我的微信订阅号:woaitest,或扫描下面的二维码添加关注:

Shell编程-12-Shell脚本规范及调试的更多相关文章

  1. shell编程之服务脚本编写,文件锁以及信号捕获

    shell脚本编程是linux运维工程师必备的技能,也是非常重要的一个技能,所以把shell编程学好,只有好处.基础语法我也就不讲了,学过C语言这些语言的,稍微看一下就能明白shell编程的基础,所以 ...

  2. shell编程系列1--shell脚本中的变量替换

    shell编程系列1--shell脚本中的变量替换 变量替换总结: .${变量#匹配规则} # 从头开始匹配,最短删除 .${变量##匹配规则} # 从头开始匹配,最长删除(贪婪模式) .${变量%匹 ...

  3. 【Shell编程】Shell程序设计

    1.Shell简介   作为Linux灵感来源的Unix系统最初是没有图形化界面的,所有的任务都是通过命令行来实现的.因此,Unix的命令行系统得到了很大的发展,逐步成为一个功能强大的系统.   Sh ...

  4. Linux - 简明Shell编程11 - 调用脚本(CallTheScript)

    脚本地址 https://github.com/anliven/L-Shell/tree/master/Shell-Basics 示例脚本及注释 主脚本: CallTheScript.sh #!/bi ...

  5. Linux shell编程02 shell程序的执行 及文件权限

    第一个shell脚本 1.       shell编程的方式 交互式shell编程 非交互式shell编程:执行的语句存放到一个文件 shell脚本:可以任意文件名,建议扩展名为sh 2.       ...

  6. shell编程01—shell基础

    01.学习shell编程需要的知识储备 1.vi.vim编辑器的命令,vimrc设置 2.命令基础,100多个命令 3.基础.高端的网络服务,nfs,rsync,inotify,lanmp,sersy ...

  7. Shell编程—图形化脚本

    1创建文本菜单 1.1普通的文本菜单 $ cat menu1 #!/bin/bash # simple script menu function diskspace { clear df -k } f ...

  8. Linux - 简明Shell编程12 - 定制输出(ColorOutput)

    脚本地址 https://github.com/anliven/L-Shell/tree/master/Shell-Basics 示例脚本及注释 #!/bin/bash echo -e "\ ...

  9. shell编程===执行shell脚本的四种方法

    使用vim创建一个shell文件,命名 hello.sh #!/bin/bash echo "hello shell !" 在linux中进行加载 chmod +x ./hello ...

随机推荐

  1. C语言中简单的for循环和浮点型变量

    浮点型变量:常数中带有小数点的叫做浮点型 以下用for循环写一个摄氏度和华氏度的转换的C程序 [见 http://www.linuxidc.com/Linux/2013-08/88513.htm ] ...

  2. js 正则表达式:密码必须由6-12位数字加字母组成

    ^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,12}$

  3. git bug修复

    在Git中,由于分支是如此的强大,所以,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除. 当你接到一个修复一个代号101的bug的任务时,很自然地,你想创建一个分支i ...

  4. istio promethus收集不到数据

    1.重新apply istio.yaml kubectl apply -f install/kubernetes/istio.yaml kubectl get metrics.config.istio ...

  5. Maven 系列 一 :Maven 快速入门及简单使用

    开发环境 MyEclipse 2014 JDK 1.8 Maven 3.2.1 1.什么是Maven? Maven是一个项目管理工具,主要用于项目构建,依赖管理,项目信息管理. 2.下载及安装 下载最 ...

  6. Loadrunner使用键盘快捷键

    ---------Loadrunner使用键盘快捷键------------ alt+f8 比较当前快照(仅限于 Web Vuser) alt+ins 新建步骤 ctrl+a 全选 ctrl+c 复制 ...

  7. linux基础编程:IO模型:阻塞/非阻塞/IO复用 同步/异步 Select/Epoll/AIO(转载)

      IO概念 Linux的内核将所有外部设备都可以看做一个文件来操作.那么我们对与外部设备的操作都可以看做对文件进行操作.我们对一个文件的读写,都通过调用内核提供的系统调用:内核给我们返回一个file ...

  8. linux利用crontab设置定时任务运行jar包

    参考链接: 1.http://blog.csdn.net/javadhh/article/details/42779505 2.http://blog.csdn.net/cctv_liu/articl ...

  9. 201621123008 《Java程序设计》第十周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 1. 常用异常 结合题集题目7-1回答 1.1 自己以前编写的代码中经常出现 ...

  10. Mybatlis SQL 注入与防范

    SQL注射原理 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具体来说,它是利用现有应用程序,将(恶意)的SQL命令 ...