Shell基础教程工具

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

2018-11-29  本文已影响0人  Surpassme

Shell脚本规范

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

#!/bin/bash
或
#!/bin/sh
export LANG="zh_CN.UTF-8"
> a):成对的符号尽量一次书写完整,而后再向里面添加内容,这样可以避免遗漏符号。
     如 {} [] '' " " ``
> b):[ ]和[[ ]] 两端至少要留有一个空格
> c):对于if/for/while/select/case 等应一次将格式写完,而后再添加对应的处理语句
> d):代码中应注意缩进,便于阅读,可使用TAB或空格,一般建议采用空格键进行缩进
> e):字符串赋值给变量应加双引号("")并且等号前后不能有空格
    如 str="Test"
> f):脚本中的书写必须为英文状态下的符号、字母等。
[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

Shell脚本调试

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

常见错误示例

[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不会对脚本错误进行精确定位,这个也是区别于其他语言的地方。
[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'
[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
[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调试技巧

> -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调试总结

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

上一篇下一篇

猜你喜欢

热点阅读