Shell编程-14-Shell脚本规范及调试

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容

  • 本文全面系统地介绍了shell脚本调试技术,包括使用echo, tee, trap等命令输出关键信息,跟踪变量的值...
    liuzg0734阅读 884评论 0 14
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,688评论 0 10
  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,341评论 0 5
  • 第 2 章 SHELL 基础知识2.1 shell脚本我们在上面简单介绍了一下什么是shell脚本,现在我们来进一...
    LiWei_9e4b阅读 1,541评论 0 0
  • 有些害怕的事,遇到后了奋力躲过后,不会让你害怕很久,却会给你一种很糟糕的感觉 ——心神不定。你会不断地幻想若自...
    keisuke阅读 254评论 0 1