如何在Linux中启用Shell脚本的调试模式

脚本是存储在一个文件的一系列命令。在终端上输入一个个命令,按顺序执行的方法太弱了,使用脚本,系统中的用户可以在一个文件中存储所有命令,反复调用该文件多次重新执行命令。

在学习脚本或写脚本的初期阶段,我们通常从写小脚本或者几行命令的短脚本开始,调试这样的脚本时我们通常无非就是通过观察它们的输出来确保其正常工作。

然而,当我们开始写非常长或上千行命令的高级脚本,例如改变系统设置的脚本,在网络上执行关键备份 等等,我们会意识到仅仅看脚本输出是不足以在脚本中找到 Bug 的!

因此,在 Linux 系列中这篇介绍 Shell 脚本调试, 我们将看看如何启用 Shell 脚本调试,然后在之后的系列中解释不同的 Shell 脚本调试模式以及如何使用它们。

如何开始写一个脚本

一个脚本与其它文件的区别是它的首行,它包含 #! (She-Bang - 释伴:定义文件类型)和路径名(解释器路径),通知系统该文件是一个命令集合,将被指定程序(解释器)解释。

下面是不同类型脚本 首行 示例:


  1. #!/bin/sh          [sh 脚本] 
  2. #!/bin/bash        [bash 脚本]  
  3. #!/usr/bin/perl    [perl 程序] 
  4. #!/bin/awk -f      [awk 脚本]    

注意:如果脚本仅包含一组标准系统命令,没有任何内部 Shell 指令,首行或 #! 可以去掉。

如何在 Linux 操作系统执行 Shell 脚本

调用一个脚本脚本的常规语法是:


  1. $ 脚本名 参数1 ... 参数N 

另一种可能的形式是明确指定将执行这个脚本的 Shell,如下:


  1. $ shell 脚本名 参数1 ... 参数N 

示例:


  1. $ /bin/bash   参数1 ... 参数N     [bash 脚本] 
  2. $ /bin/ksh   参数1 ... 参数N      [ksh 脚本] 
  3. $ /bin/sh   参数1 ... 参数N       [sh 脚本] 

对于没有 #! 作为首行,仅包含基础系统命令的脚本,示例如下:


  1. ### 脚本仅包含标准系统命令 
  2. cd /home/$USER 
  3. mkdir tmp 
  4. echo "tmp directory created under /home/$USER" 

使它可执行并运行,如下:


  1. $ chmod +x  脚本名 
  2. $ ./脚本名  

启用 Shell 脚本调试模式的方法

下面是主要的 Shell 脚本调试选项:

  • -v (verbose 的简称) - 告诉 Shell 读取脚本时显示所有行,激活详细模式。
  • -n (noexec 或 no ecxecution 简称) - 指示 Shell 读取所有命令然而不执行它们,这个选项激活语法检查模式。
  • -x (xtrace 或 execution trace 简称) - 告诉 Shell 在终端显示所有执行的命令和它们的参数。 这个选项是启用 Shell 跟踪模式。

1、 改变 Shell 脚本首行

第一个机制是改变 Shell 脚本首行,如下,这会启动脚本调试。


  1. #!/bin/sh 选项 

其中, 选项可以是上面提到的一个或多个调试选项。

2、 调用 Shell 调试选项

第二个是使用如下调试选项启动 Shell,这个方法也会打开整个脚本调试。


  1. $ shell 选项 参数1 ... 参数N 

示例:


  1. $ /bin/bash 选项 参数1 ... 参数N 

3、 使用 Shell 内置命令 set

第三个方法是使用内置命令 set 去调试一个给定的 Shell 脚本部分,如一个函数。这个机制是重要的,因为它让我们可以去调试任何一段 Shell 脚本。

我们可以如下使用 set 命令打开调试模式,其中选项是之前提到的所有调试选项。


  1. $ set 选项 

启用调试模式:


  1. $ set -选项 

禁用调试模式:


  1. $ set +选项 

此外,如果我们在 Shell 脚本不同部分启用了几个调试模式,我们可以一次禁用所有调试模式,如下:


  1. $ set - 

关于启用 Shell 脚本调试模式,先讲这些。正如我们看到的,我们可以调试一整个 Shell 脚本或者特定部分脚本。

在此系列下面的两篇文章中,我们会举例介绍如何使用 Shell 脚本调试选项,进一步了解 详细verbose、语法检查syntax checking、 跟踪tracing调试模式。

更重要的是,关于这个指南,欢迎通过下面评论提出任何问题或反馈。

作者:Aaron Kili

来源:51CTO

时间: 2024-08-03 13:32:39

如何在Linux中启用Shell脚本的调试模式的相关文章

如何在 Linux 中启用 Shell 脚本的调试模式

脚本是存储在一个文件的一系列命令.在终端上输入一个个命令,按顺序执行的方法太弱了,使用脚本,系统中的用户可以在一个文件中存储所有命令,反复调用该文件多次重新执行命令. 在学习脚本或写脚本的初期阶段,我们通常从写小脚本或者几行命令的短脚本开始,调试这样的脚本时我们通常无非就是通过观察它们的输出来确保其正常工作. 然而,当我们开始写非常长或上千行命令的高级脚本,例如改变系统设置的脚本,在网络上执行关键备份 等等,我们会意识到仅仅看脚本输出是不足以在脚本中找到 Bug 的! 因此,在 Linux 系列

linux中的shell脚本管理(二)

在Shell脚本中执行使用if语句的好处是:可以根据特定的条件(eg:判断备份目录是否存在)来决定是否执行某项操作,当满足不同的条件时执行不同的操作(eg:备份目录不存在则创建该目录,否则跳过操作).该文将分别从条件测试操作,if语句结构,应用示例这三个方面讲解if语句在Shell脚本中的应用. 1.条件测试操作: 需要在Shell脚本中有选择性地执行任务时,首先面临的问题就是,如何设置命令执行的条件? 在Shell环境中,可以根据命令执行后返回状态值来判断该命令是否成功执行,当返回值为0是表示

在Linux中使用shell脚本自动创建/移除并挂载交换文件

几天前我们写了一篇关于在 Linux 中 3 种创建交换文件的方法,它们是常见的方法,但是需要人工操作. 今天我发现了一个 Gary Stafford[1] 写的 shell 小脚本(两个 shell 脚本,一个用于创建交换文件,另外一个用于移除交换文件),它可以帮助我们在 Linux 中创建/移除并且自动挂载交换文件. 默认这个脚本创建并挂载 512MB 的交换文件.如果你想要更多的交换空间和不同的文件名,你需要相应地修改脚本.修改脚本不是一件困难的事,因为这是一个容易上手而且很小的脚本. 推

linux中利用shell脚本监控网站状态异常

  最近刚好需要测试一下新建站的稳定性,所以写了个SHELL脚本放到本机(最近换了mac本),能够实时查看你需要监控的WEB页面状态,并发送到指定邮箱.     这里赞一下OS X自带有crontab计划任务,可以直接在本机测试脚本啦^_^    代码如下 复制代码 # vi check_web_alive.sh --------------------------------------------------------------------- #!/bin/bash PATH=/bin:

Linux中执行shell脚本的4种方法总结_linux shell

bash shell 脚本的方法有多种,现在作个小结.假设我们编写好的shell脚本的文件名为hello.sh,文件位置在/data/shell目录中并已有执行权限. 方法一:切换到shell脚本所在的目录(此时,称为工作目录)执行shell脚本: 复制代码 代码如下: cd /data/shell ./hello.sh ./的意思是说在当前的工作目录下执行hello.sh.如果不加上./,bash可能会响应找到不到hello.sh的错误信息.因为目前的工作目录(/data/shell)可能不在

linux中利用Shell脚本自动提交网站404死链到搜索引擎

  Shell脚本 说做就做,简单的写了个 Shell 脚本就搞定了! 脚本名称:网站死链生成脚本 脚本功能:每天定时分析网站前一天的 nginx 日志, 然后提取状态码为404并且UA为百度蜘蛛的抓取路径,并写入到网站根目录下的 death.txt 文件,用于提交百度死链. 脚本代码: #!/bin/bash #Desc: Death Chain File Script #Author: ZhangGe #Blog: http://你的域名/5038.html #Date: 2015-05-0

linux中防止shell脚本重复执行

今天在jenkins里部署的时候,由于开发们多次频繁的提交的代码,造成jenkins里的shell脚本在那频繁的部署,为了阻止这样的问题,专门找了个防止重复执行的代码.下面来看代码: #!/bin/bash   LOCK_NAME="/tmp/my.lock" if ( set -o noclobber; echo "$$" > "$LOCK_NAME") 2> /dev/null; then         trap 'rm -f

linux中的shell脚本管理(一)

一:Shell的作用及常见种类: Shell是一个特殊的应用程序,他介于操作系统内核与用户之间,负责接受用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内核执行.因此,Shell程序在系统中充当了一个"命令解释器"的角色,eg:微软的cmd.exe也属于Shell程序: 在Unix/Linux操作系统中,能够使用的Shell程序有很多种,功能也比微软的"cmd.exe"要强大的多,下面就是常见到的Shell程序环境,(功能可以自己去了解下:) Bsh:

linux中使用shell脚本检测内存使用情况

 公司服务器最近两天老是因为内存被使用满而造成死机,实在是受不了老叫机房的人去帮忙重启,专门写了个脚本来释放下内存,当然这台服务器不是太重要,我粗鲁的处理方式估计不会适合大多数服务器,请大家使用之前先考虑清楚,不然造成数据丢失就不关我的事了. 脚本内容: cat check-mem.sh #!/bin/bash mem_total=`free -m | awk 'NR==2' | awk '{print $2}'` mem_free=`free -m | awk 'NR==3' | awk '{