我们开启了 Shell 脚本调试系列文章,先是解释了不同的调试选项,下面介绍如何启用shell调试模式。

写完脚本后,建议在运行脚本之前先检查脚本中的语法,而不是查看它们的输出以确认它们是否正常工作。

在本系列的这一部分,我们将了解如何使用语法检查调试模式。记住我们之前在本系列的第一部分中解释了不同的调试选项,在这里,我们将使用它们来执行脚本调试。

启用 verbose 调试模式

在进入本指导的重点之前,让我们简要地探索下 verbose 模式。它可以用 -v 调试选项来启用,它会告诉 shell 在读取时显示每行。

要展示这个如何工作,下面是一个示例脚本来批量图片替换。

将下面内容输入(或者复制粘贴)到一个文件中。

#!/bin/bash#convertfor p_w_picpath in *.png; doconvert  "$p_w_picpath"  "${p_w_picpath%.png}.jpg"echo "p_w_picpath $p_w_picpath converted to ${p_w_picpath%.png}.jpg"doneexit 0

接着保存文件,并用下面的命令使脚本可执行:

$ chmod +x script.sh

我们可以执行脚本并显示它被 Shell 读取到的每一行:

$ bash -v script.sh

在 Shell 脚本中启用语法检查调试模式

回到我们主题的重点,-n 激活语法检查模式。它会让 shell 读取所有的命令,但是不会执行它们,它(shell)只会检查语法。

一旦 shell 脚本中发现有错误,shell 会在终端中输出错误,不然就不会显示任何东西。

激活语法检查的命令如下:

$ bash -n script.sh

因为脚本中的语法是正确的,上面的命令不会显示任何东西。所以,让我们尝试删除结束 for 循环的 done 来看下是否会显示错误:

下面是修改过的含有 bug 的批量将 png 图片转换成 jpg 格式的脚本。

#!/bin/bash#script with a bug#convertfor p_w_picpath in *.png; doconvert  "$p_w_picpath"  "${p_w_picpath%.png}.jpg"echo "p_w_picpath $p_w_picpath converted to ${p_w_picpath%.png}.jpg"exit 0

保存文件,接着运行该脚本并执行语法检查:

$ bash -n script.sh

从上面的输出中,我们看到我们的脚本中有一个错误,for 循环缺少了一个结束的 done 关键字。shell 脚本从头到尾检查文件,一旦没有找到它(done),shell 会打印出一个语法错误:

script.sh: line 11: syntax error: unexpected end of file

我们可以同时结合 verbose 模式和语法检查模式:

$ bash -vn script.sh

另外,我们可以通过修改脚本的首行来启用脚本检查,如下面的例子:

#!/bin/bash -n#altering the first line of a script to enable syntax checking#convertfor p_w_picpath in *.png; doconvert  "$p_w_picpath"  "${p_w_picpath%.png}.jpg"echo "p_w_picpath $p_w_picpath converted to ${p_w_picpath%.png}.jpg"exit 0

如上所示,保存文件并在运行中检查语法:

$ ./script.shscript.sh: line 12: syntax error: unexpected end of file

此外,我们可以用内置的 set 命令来在脚本中启用调试模式。

下面的例子中,我们只检查脚本中的 for 循环语法。

#!/bin/bash#using set shell built-in command to enable debugging#convert#enable debuggingset -nfor p_w_picpath in *.png; doconvert  "$p_w_picpath"  "${p_w_picpath%.png}.jpg"echo "p_w_picpath $p_w_picpath converted to ${p_w_picpath%.png}.jpg"#disable debuggingset +nexit 0

再一次保存并执行脚本:

$ ./script.sh 

总的来说,我们应该保证在执行 Shell 脚本之前先检查脚本语法以捕捉错误。

转载于:https://blog.51cto.com/215687833/1891627

如何在 Shell 脚本中执行语法检查调试模式相关推荐

  1. 在 Shell 脚本中执行语法检查调试模式

    文章目录 shell 脚本调试系列 概述 启用 verbose 调试模式 在 Shell 脚本中启用语法检查调试模式 通过修改脚本的首行来启用脚本检查 内置的 set 命令来在脚本中启用调试模式 sh ...

  2. shell脚本中执行命令_如何在Shell脚本中执行命令?

    shell脚本中执行命令 Shell is a command-line interpreter that allows the user to interact with the system. I ...

  3. 如何在Shell脚本中使用if-else?

    Moving ahead from our previous tutorial on arrays in shell scripts, let's understand how we can use ...

  4. linux脚本中如何读取文件,如何在Shell脚本中逐行读取文件

    原标题:如何在Shell脚本中逐行读取文件 在这里,我们学习Shell脚本中的3种方法来逐行读取文件. 方法一.使用输入重定向 逐行读取文件的最简单方法是在while循环中使用输入重定向. 为了演示, ...

  5. 如何在脚本中输入密码 linux,如何在shell脚本中为用户分配密码

    本篇文章给大家介绍的内容是关于如何在shell脚本中为用户分配密码,下面我们来看具体的内容. 我们先来看一下命令echo | passwd –stdin 例如: 使用以下命令更改shell脚本中用户j ...

  6. shell有bool运算么_如何在shell脚本中声明和使用布尔变量?

    我尝试使用以下语法在shell脚本中声明一个布尔变量:variable=$false variable=$true 它是否正确? 另外,如果我想更新该变量,我会使用相同的语法? 最后,使用布尔变量作为 ...

  7. shell脚本中执行 source /etc/profile 或者 source ~/.bashrc 不能生效的原因

    执行脚本时,其中的命令是在一个子shell中执行的.子shell继承了父shell的环境变量,但无法修改他们,或者说所做的修改仅对子shell有效.所以当shell脚本执行完后,到了回到shell命令 ...

  8. linux脚本done报错,linux – 如何在shell脚本中处理错误/异常?

    下面是我在bash中执行的脚本.它工作正常. fileexist=0 for i in $( ls /data/read-only/clv/daily/Finished-HADOOP_EXPORT_& ...

  9. 如何在Linux Shell脚本中执行MongoDB命令

    今天有同事问到了,简单的写两个应用. 方法一   shell脚本代码如下: #! /bin/bash./mongo 127.0.0.1:27017/test <<EOFvar cursor ...

最新文章

  1. 2017-2018-1 20155201 实验五 通讯协议设计
  2. IDEA 部署项目的时候出错:Jar not loaded错误
  3. D3js(二): d3js基础
  4. UOJ #578. 收集卡片
  5. android底层rsa加密,android 下RSA加密解密
  6. de.hybris.platform.servicelayer.dto.converter.ConversionException
  7. Android—显示窗口调用相机与相册
  8. 工业交换机厂家有哪些?工业交换机十大品牌供应商!
  9. C++(STL):14--- forward_list比list更高效的容器
  10. 微软警告:警惕新型勒索软件 PonyFinal,已现身印度、伊朗和美国
  11. cocos2dx骨骼动画Armature源码分析(一)
  12. C语言排序算法(一):冒泡排序
  13. 服务器空岛怎么修改地形,《迷你世界》2021空岛地形码如何输入 空岛地形码介绍...
  14. 爱剪辑 服务器维护,爱剪辑联网检测失败怎么办-修复爱剪辑联网检测失败的方法 - 河东软件园...
  15. 计算机组成原理三种译码方式,计算机组成原理第三章存储系统
  16. 免费全平台直播推流软件OBS Studio应用
  17. s2sh整合(详细版)
  18. 关于overflow适配IE的问题
  19. 温度传感器DS18B20的使用
  20. 日常记录:java启动参数 -javaagent的使用,应用启动前添加代理包并且注册Mbean

热门文章

  1. Cisco路由器故障诊断技术
  2. ^和$ emeditor
  3. 如何理解Return的返回值?
  4. 数据中心是虚拟现实的基石
  5. IIS6.0 web.config
  6. ros与下位机通信常用的c++ boost串口应用
  7. 服务器负载均衡(1)
  8. HibernateDaoSupport的使用
  9. 请确保 ASP.NET State Service (ASP.NET 状态服务)已启动,并且客户端端口与服务器端口相同...
  10. 修改Exchange邮件报警信息