2023年11月27日发(作者:)

shell脚本的多种执⾏⽅法及调试⽅法

执⾏脚本:脚本⽂件名称为,前⽬录为/data/shell,⽤chmod +x 给该脚本附加执⾏权限

⽅法1cd到当前⽬录,⽤./执⾏,此处必须有点.,表⽰的是在当前的⼯作⽬录下执⾏。如果不加上./bash可能会响应找到不到的错误信息。因为⽬

前的⼯作⽬录(/data/shell)可能不在执⾏程序默认的搜索路径之列,也就是说,不在环境变量PASH的内容之中。查看PATH的内容可⽤ echo $PASH 命令。现在的/data/shell就不在环境

变量PASH中的,所以必须加上./才可执⾏。

⽅法2:以绝对路径的⽅式去执⾏bash shell脚本:/data/shell/

⽅法3:直接使⽤bash sh 来执⾏bash shell脚本:

cd到当前⽬录下,⽤bash 或者sh 执⾏,此时该脚本可以⽆执⾏权限,

注:bashsh在执⾏⽂件时的不同,是分别⽤⾃⼰的shell来跑⽂件。 sh使⽤“-n”选项进⾏shell脚本的语法检查,使⽤“-x”选项实现shell脚本逐条语句的跟踪,可以巧妙地利⽤shell的内置

变量增强“-x”选项的输出信息等。

若是以⽅法3的⽅式来执⾏,那么,可以不必事先设定shell的执⾏权限,甚⾄都不⽤写shell⽂件中的第⼀⾏(指定bash路径)。因为⽅法3是将作为参数传给sh(bash)命令来

执⾏的。这时不是⾃⼰来执⾏,⽽是被⼈家调⽤执⾏,所以不要执⾏权限。也不⽤指定bash路径

⽅法4 source 或者.

此时该脚本可以⽆执⾏权限

source(或点)命令通常⽤于重新执⾏刚修改的初始化⽂档。

source命令( C Shell ⽽来)bash shell的内置命令。

点命令,就是个点符号,(Bourne Shell⽽来)。就是顺序的执⾏⽂件⾥的命令⽽已。

source sh ./执⾏脚本的区别在那⾥呢?

1.shell脚本具有可执⾏权限时,⽤sh ./执⾏脚本是没有区别得。./是因为当前⽬录没有在PATH中,所有"."是⽤来表⽰当前⽬录的。

重新建⽴⼀个⼦shell,在⼦shell中执⾏脚本⾥⾯的语句,该⼦shell继承⽗shell的环境变量,但⼦shell新建的、改变的变量不会被带回⽗shell,除⾮使⽤export

:这个命令其实只是简单地读取脚本⾥⾯的语句依次在当前shell⾥⾯执⾏,没有建⽴新的⼦shell。那么脚本⾥⾯所有新建、改变变量的语句都会保存在当前shell

⾯。

执⾏脚本的时候,要传的参数跟在脚本⽂件名后边,⽤空格隔开,且多个参数之间也是⽤空格隔开,如要给传递两个参数则如下:

chmod +x

./ param1 param2

shell脚本的调试

如何调试Shell脚本

1) 检查语法错误:

⼀般来说我们可以通过修改shell脚本的源代码,令其输出相关的调试信息来定位错误,那有没有不修改源代码来调试shell脚本的⽅法呢?答案就是使⽤shell的执⾏选,下⾯是⼀些常⽤选

项的⽤法:

-n 只读取shell脚本,但不实际执⾏

-x 进⼊跟踪⽅式,显⽰所执⾏的每⼀条命令

-c "string" strings中读取命令

“-n”可⽤于测试shell脚本是否存在语法错误,但不会实际执⾏命令。在shell脚本编写完成之后,实际执⾏之前,⾸先使⽤“-n”选项来测试脚本是否存在语法错误是⼀个很好的习惯。因为某

shell脚本在执⾏时会对系统环境产⽣影响,⽐如⽣成或移动⽂件等,如果在实际执⾏才发现语法错误,您不得不⼿⼯做⼀些系统环境的恢复⼯作才能继续测试这个脚本。

“-c”选项使shell解释器从⼀个字符串中⽽不是从⼀个⽂件中读取并执⾏shell命令。当需要临时测试⼀⼩段脚本的执⾏结果时,可以使⽤这个选项,如下所⽰:

sh -c 'a=1;b=2;let c=$a+$b;echo "c=$c"'

"-x"选项可⽤来跟踪脚本的执⾏,是调试shell脚本的强有⼒⼯具。“-x”选项使shell在执⾏脚本的过程中把它实际执⾏的每⼀个命令⾏显⽰出来,并且在⾏⾸显⽰⼀个"+"号。 "+"号后⾯显⽰

的是经过了变量替换之后的命令⾏的内容,有助于分析实际执⾏的是什么命令。 “-x”选项使⽤起来简单⽅便,可以轻松对付⼤多数的shell调试任务,应把其当作⾸选的调试⼿段。

2) 调试⼯具-bashdb

使⽤shell调试器bashdb,这是⼀个类似于GDB的调试⼯具,可以完成对shell脚本的断点设置,单步执⾏,变量观察等许多功能。

使⽤bashdb进⾏debug的常⽤命令

1.列出代码和查询代码类:

l 列出当前⾏以下的10

- 列出正在执⾏的代码⾏的前⾯10

. 回到正在执⾏的代码⾏

w 列出正在执⾏的代码⾏前后的代码

/pat/ 向后搜索pat

pat?向前搜索pat

控制类:

h 帮助

help 命令 得到命令的具体信息

q 退出bashdb

x 算数表达式 计算算数表达式的值,并显⽰出来

!!空格Shell命令 参数 执⾏shell命令

使⽤bashdb进⾏debug的常⽤命令(cont.)

控制脚本执⾏类:

n 执⾏下⼀条语句,遇到函数,不进⼊函数⾥⾯执⾏,将函数当作⿊盒

s n 单步执⾏n次,遇到函数进⼊函数⾥⾯

b ⾏号n 在⾏号n处设置断点

del ⾏号n 撤销⾏号n处的断点

c ⾏号n ⼀直执⾏到⾏号n

R 重新启动

Finish 执⾏到程序最后

cond n expr 条件断点