当前位置:   article > 正文

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

./2test-if.sh: 第 4 行: [: 缺少 "]

Shell脚本规范

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

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

Shell脚本调试

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

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

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

在运行Shell脚本出现错误后,不能单看提示的错误行,需要结合提示行前后进行排错。Shell不会对脚本错误进行精确定位,这个也是区别于其他语言的地方。
  • 2、循环语句中缺少关键字或关键字拼写不正确
  1. [root@localhost Test]# cat -n testif.sh
  2. 1 #!/bin/bash
  3. 2 while
  4. 3 do
  5. 4 if [ -f /root/Test/a.sh ]
  6. 5 then
  7. 6 echo "/root/Test/a.sh exist"
  8. 7 else
  9. 8 echo "/root/Test/a.sh no exist" # 结尾少了done
  10. [root@localhost Test]# bash testif.sh
  11. testif.sh:行3: 未预期的符号 `do' 附近有语法错误
  12. testif.sh:行3: ` do'
  • 3、成对的符号落了单
  1. [root@localhost Test]# cat -n testif.sh
  2. 1 #!/bin/bash
  3. 2 #while
  4. 3 #do
  5. 4 if [ -f /root/Test/a.sh # 缺少 ]
  6. 5 then
  7. 6 echo "/root/Test/a.sh exist"
  8. 7 else
  9. 8 echo "/root/Test/a.sh no exist"
  10. 9 fi
  11. [root@localhost Test]# bash testif.sh
  12. testif.sh: 第 4 行:[: 缺少 `]'
  13. /root/Test/a.sh no exist
  • 4、[]和[[]]两端缺少空格
  1. [root@localhost Test]# cat testif.sh
  2. #!/bin/bash
  3. #while
  4. #do
  5. if [-f /root/Test/a.sh] # [] 两端没有空格
  6. then
  7. echo "/root/Test/a.sh exist"
  8. else
  9. echo "/root/Test/a.sh no exist"
  10. fi
  11. [root@localhost Test]# bash testif.sh
  12. testif.sh:行4: [-f: 未找到命令
Shell调试技巧
  • 1、Windows中编写脚本明明语法什么均正确,在Linux中跟却提示各种语法错误,这种情况建议优先在Linux写脚本。因为Windows中和格式与Linux格式还是有很多差异的。
  • 2、在代码关键地方打印日志,如使用echo
  • 3、使用bash命令参数调试,常用调试参数如下所示:
  1. > -n : 不执行脚本仅检查脚本语法是否存在错误
  2. > -v : 先将脚本内容显示到屏幕再执行执行脚本
  3. > -x : 将执行脚本的内容及输出全部显示到屏幕上

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

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

-v参数示例:

  1. [root@localhost Test]# bash -v testif.sh # 显示脚本内容并执行脚本
  2. #!/bin/bash
  3. #while
  4. #do
  5. if [ -f /root/Test/a.sh ]
  6. then
  7. echo "/root/Test/a.sh exist"
  8. else
  9. echo "/root/Test/a.sh no exist"
  10. fi
  11. /root/Test/a.sh no exist # 脚本执行结果

-x参数示例:

  1. [root@localhost Test]# cat -n sum.sh
  2. 1 #!/bin/bash
  3. 2 function Sum () {
  4. 3 for((i=1;i<=$1;i++))
  5. 4 do
  6. 5 ((sum=sum+i))
  7. 6 echo "{1..$1} sum is :" ${sum}
  8. 7 done
  9. 8 }
  10. 9
  11. 10 Sum $1
  12. 11 if [ $? == "0" ]
  13. 12 then
  14. 13 echo "Completed"
  15. 14 else
  16. 15 echo "Error"
  17. 16 fi
  18. [root@localhost Test]# bash -x sum.sh 5
  19. + Sum 5
  20. + (( i=1 ))
  21. + (( i<=5 ))
  22. + (( sum=sum+i ))
  23. + echo '{1..5} sum is :' 1
  24. {1..5} sum is : 1
  25. + (( i++ ))
  26. + (( i<=5 ))
  27. + (( sum=sum+i ))
  28. + echo '{1..5} sum is :' 3
  29. {1..5} sum is : 3
  30. + (( i++ ))
  31. + (( i<=5 ))
  32. + (( sum=sum+i ))
  33. + echo '{1..5} sum is :' 6
  34. {1..5} sum is : 6
  35. + (( i++ ))
  36. + (( i<=5 ))
  37. + (( sum=sum+i ))
  38. + echo '{1..5} sum is :' 10
  39. {1..5} sum is : 10
  40. + (( i++ ))
  41. + (( i<=5 ))
  42. + (( sum=sum+i ))
  43. + echo '{1..5} sum is :' 15
  44. {1..5} sum is : 15
  45. + (( i++ ))
  46. + (( i<=5 ))
  47. + '[' 0 == 0 ']'
  48. + echo Completed
  49. Completed

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

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

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

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

转载于:https://www.cnblogs.com/surpassme/p/10041382.html

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号