启用 verbose 调试模式

在进入本指导的重点之前,让我们简要地探索下 verbose 模式。它可以用 -v 调试选项来启用,它会告诉 shell 在读取时显示每行。要展示这个如何工作,下面是一个示例脚本来批量将 PNG 图片转换成 JPG 格式。

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

#!/bin/bash
#convert
for image in *.png; do
convert "$image" "${image%.png}.jpg"
echo "image $image converted to ${image%.png}.jpg"
done
exit 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
#convert
for image in *.png; do
convert  "$image"  "${image%.png}.jpg"
echo "image $image converted to ${image%.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
#convert
for image in *.png; do
convert  "$image"  "${image%.png}.jpg"
echo "image $image converted to ${image%.png}.jpg"
exit 0

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

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

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

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

#!/bin/bash
#using set shell built-in command to enable debugging
#convert
#enable debugging
set -n
for image in *.png; do
convert  "$image"  "${image%.png}.jpg"
echo "image $image converted to ${image%.png}.jpg"
#disable debugging
set +n
exit 0

再一次保存并执行脚本:

$ ./script.sh

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

本文地址 :  http://www.linuxprobe.com/shellcheck-grammar.html

免费提供最新Linux技术教程书籍,为开源技术爱好者努力做得更多更好:http://www.linuxprobe.com/

详解shell语法检查模式相关推荐

  1. 11. shell当中read详解,read语法选项,read用法示例,脚本示例,while read line详解,掌握原则

    shell当中read详解,read语法选项,read用法示例,脚本示例,while read line详解,掌握原则 文章目录 1.1 read详解 1.2 用法示例 1.3 while read ...

  2. cut最后几位 shell_详解Shell cut用法

    详解Shell cut用法 cut是以每一行为一个处理对象的,这种机制和sed一样. cut接受三个定位方法: 1)byte: -b 2)characters: -c 3)fields: -d eg: ...

  3. Linux系统上hdparm工具参数详解,硬盘检查、测速、设定和优化

    Linux系统上hdparm工具参数详解,硬盘检查.测速.设定和优化 2012/07/25 hdparm, 硬盘 Linux命令相关 1 6,757 hdparm的功能:显示与设定硬盘的参数.hdpa ...

  4. 详解Shell编程之if语句实战(小结)

    本篇文章主要介绍了详解Shell编程之if语句实战(小结),小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 对于if语句,其实很多人都肯定的听说过,那么if语句到底是什么, ...

  5. linux shell语法检查或者查看shell脚本执行过程的参数介绍及两种使用方法

    shell语法检查或者查看shell脚本执行过程的参数介绍及两种使用方法 一.常用参数概述: set -x 与 set +x 在liunx脚本中可用set -x就可有详细的日志输出,省的老是要echo ...

  6. sh执行文件 参数传递_详解shell中脚本参数传递的两种方式

    方式一:$0,$1,$2.. 采用$0,$1,$2..等方式获取脚本命令行传入的参数,值得注意的是,$0获取到的是脚本路径以及脚本名,后面按顺序获取参数,当参数超过10个时(包括10个),需要使用${ ...

  7. python input与返回值-Python 详解基本语法_函数_返回值

    Python 详解基本语法 概要: 函数的返回值是函数重要的组成部分.函数的根本在于实现程序的部分功能,所以很多时候我们需要将函数执行后的结果返回给程序再由程序作出进一步的操作.可以说是函数的返回值令 ...

  8. python模式匹配算法_详解Python 最短匹配模式

    问题 你正在试着用正则表达式匹配某个文本模式,但是它找到的是模式的最长可能匹配. 而你想修改它变成查找最短的可能匹配. 解决方案 这个问题一般出现在需要匹配一对分隔符之间的文本的时候(比如引号包含的字 ...

  9. linux exec 脚本之家,详解Shell脚本中调用另一个Shell脚本的三种方式

    主要以下有几种方式: Command Explanation fork 新开一个子 Shell 执行,子 Shell 可以从父 Shell 继承环境变量,但是子 Shell 中的环境变量不会带回给父 ...

最新文章

  1. javascript面向对象系列第一篇——构造函数和原型对象
  2. verilog中对inout信号的处理
  3. 在神经反馈任务中同时进行EEG-fMRI,多模态数据集成的大脑成像数据集
  4. Oracle osw监控工具的使用示例
  5. 003_数据模型一览
  6. 如何解决远程桌面无法连接问题--远程桌面连接工具
  7. pandas内容像日期的数据如何变成真DataTime,并赋予时间类似的操作
  8. 全球及中国胶合板行业产量规模与营运能力研究报告2022版
  9. 接口与继承 课后实践
  10. A-Deeper-Understanding-of-Spark-Internals(Spark内核深入理解)
  11. [Java_kaikeba]java中堆和栈的区别(对象变量的理解)
  12. python 导入的nan怎么解决_用Python处理了数据还要导入Excel做图表?直接Python做漂亮图表...
  13. android中常用的宏,iOS-开发中常用的宏有哪些?
  14. 基于avr atmega16单片机控制2路9g舵机进行0-180°旋转,1602显示运行状态,adc采样控制舵机转速。然后适合于初学avr单片机的朋友
  15. NXP JN5169 电源管理和睡眠模式
  16. Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day26】—— Spring框架3
  17. 知行合一ArduPilot | ArduPilot控制器框架简述与PID参数整定
  18. win10连接android手机助手下载,完美win10手机助手-Win10手机助手v1.0.1 官方免费版下载_飞翔下载...
  19. Laravel的ORM模型的find(),findOrFail(),first(),firstOrFail(),get(),list(),toArray()之间的区别是什么?
  20. 计蒜客 人人都有极客精神(模拟)

热门文章

  1. php大学期末重点,大学期末直接搜题
  2. 解决mybaits if标签条件搜索失效的问题 贺兰的博客
  3. Android给视频添加背景音乐的解决方案
  4. 计算机高考怎么复习,高考倒计时30天,清北学霸倾情传授高效复习秘籍
  5. Qt 图形视图框架(Qt MVC)
  6. DOS/BAT批处理if exist else 语句的几种用法
  7. 用隐马尔可夫模型(HMM)做命名实体识别——NER系列(一)
  8. Linux查看网络链接详情数据
  9. Android图片缓存框架 - Fresco实现圆角或圆形图片 (四)
  10. QA「微搭低代码」小程序相关问题