1、使用dos2unix命令处理在windows下开发的脚本

将windows下编辑的脚本放置到linux下执行的情况如下:

[root@ks ~]# cat -v nginx.sh
#!/bin/bash^M
a=1 n^M
sum=0 ^M
while ((a <=50 ))^M
do^M
((sum=sum+a)) ^M
((a++)) ^M
done^M

[root@ks ~]# sh nginx.sh     #执行脚本 
: command not found
: command not found
'ginx.sh: line 4: syntax error near unexpected token `
'ginx.sh: line 4: `while ((i <=100 ))

在上述的过程中,在windows下开发的脚本,检查没有问题。但在linux系统中执行时出现莫名其妙的语法错误。这时,最好执行dos2unix格式化一下。

#格式化命令安装
[root@ks ~]# yum -y install dos2unix
#使用方法
[root@ks ~]# dos2unix nginx.sh
dos2unix: converting file nginx.sh to UNIX format ...
#再次查看

[root@ks ~]# cat -v nginx.sh
#!/bin/bash
a=1 n
sum=0
while ((a <=50 ))
do
((sum=sum+a))
((a++))
done

提示:^M消失了,说明已正常。windows下代码的换行符合linux下的不一样,导致了本例的问题。在windows下开发的脚本或非自己所写,需要使用dos2unix格式化,防止执行过程中出现错误。

不仅仅.sh脚本可以转换,其他.txt等win上文件也可以通过该命令转换

2、使用bash命令参数调试

[root@ks ~]# sh [-nvx] nginx.sh

参数说明:
-n:不会执行该脚本,仅查询脚本语法是否有问题,并给出错误提示
-v:在执行脚本时,先将脚本的内容输出到屏幕上,然后执行脚本。如果有错误,也会给出错误提示。
-x:将执行的脚本内容及输出显示到屏幕上,这是对调试很有用的参数。

注:参数-x是追踪脚本执行过程一种非常好的方法,他可以在执行前列出所执行的所有程序段。

如果程序段落,在输出时,最前面会加上+符号,表示程序代码。

如果执行脚本发生问题(非语法问题时),利用-x参数,就可以知道问题出在哪一行

一般情况下如果是调试逻辑错误的脚本,用-x的参数效果更佳。

缺点:加载系统函数库等很多我们不想查看其整个过程的脚本时,会有太多输出,导致很难查看所需要的内容。

3、使用echo命令调试

echo命令是最有用的调试脚本的工具之一。一般应在可能出现的问题的脚本重要的部分加入echo命令(在变量读取或修改操作的前后加入echo命令,并紧挨着退出命令exit)。此调试方法不仅适用于shell,在php、Python语言中经常使用。

范例:

[root@ks ~]# cat  debug.sh
#!/bin/bash
read -p "please input two number:" a b
echo $a $b #输出变量,查看获取的变量值
exit #退出脚本,不继续执行脚本。 if (($a < $b))
then
echo "$a<$b"
elif (($a == $b))
then
echo "$a=$b"
else
echo "$a>$b"
fi

4、使用set命令调试部分脚本内容

set 命令也可以用于辅助脚本调试。

set命令常用的调试选项:

  • set -n :读取命令单并不执行
  • set -v :显示读取的所有行
  • set -x :显示所有命令及其参数

提示:通过set -x 命令开启调试功能,而通过set +x 关闭调试功能。

set命令最大优点是,和bash -x相比,set -x可以缩小调试的作用域。

[root@ks ~]# cat debug.sh

#!/bin/bash
read -p "please input two number:" a b
set -x #开启调试
if (($a < $b))
then
echo "$a<$b"
elif (($a == $b))
then
echo "$a=$b"
else
echo "$a>$b"
fi
set +x #结束调试,只针对set -x 和set +x 之间的脚本进行调试 echo "完美"

执行脚本查看调试结果:

复制代码

[root@ks ~]# sh debug.sh
please input two number:
+ (( < ))
+ (( == ))
+ echo =
=
+ set +x
完美 提示:加了set +x,在运行脚本的时候,无需使用sh -x 。

参考:https://www.cnblogs.com/freeblogs/p/7819767.html

shell中脚本调试----学习的更多相关文章

  1. Shell中脚本变量的作用域

    原文地址:http://blog.csdn.net/abc86319253/article/details/46341839    在shell中定义函数可以使代码模块化,便于复用代码.不过脚本本身的 ...

  2. shell中脚本与函数的使用策略

    脚本:运行的副作用不影响父环境,开辟了fork子进程; 函数:副作用,定义的变量,数据默认直接添加到了调用者的环境,也是它自己的环境;不想副作用影响调用者环境,就必须主动用local修饰; shell ...

  3. [Z] Shell中脚本变量和函数变量的作用域

    在shell中定义函数可以使代码模块化,便于复用代码.不过脚本本身的变量和函数的变量的作用域问题可能令你费解,在这里梳理一下这个问题. (1)Shell脚本中定义的变量是global的,其作用域从被定 ...

  4. shell编程学习笔记(五):Shell中脚本的参数

    在执行Shell脚本的时候,可以在执行时带上参数,相当于传递参数给脚本,下面我们看一下怎么使用这个参数 以下蓝色字体部分为Linux命令,红色字体的内容为输出的内容: # cd /opt/script ...

  5. Shell中read命令--学习

    read命令 -p(提示语句) -n(字符个数) -t(等待时间) -s(不回显) 1.基本读取read命令接收标准输入(键盘)的输入,或其他文件描述符的输入(后面在说).得到输入后,read命令将数 ...

  6. shell中脚本变量和函数变量的作用域

    http://blog.csdn.net/ltx19860420/article/details/5570902 1. shell脚本中定义的变量是global的,其作用域从被定义的地方开始,到she ...

  7. shell中的调试与计算

    shell 计算  2.正确方法   1)使用let   var=1   let "var+=1"   echo $var   输出结果为2,这次没有悲剧   注意:   a)经我 ...

  8. 使用shell/bat脚本调试java程序示例

    一.linux下shell启动java #!/bin/sh JAVA_HOME=/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre # JVM_OPT ...

  9. shell中脚本参数传递getopts

    while getopts ":a:b:c:" opt do case $opt in a) echo "参数a的值$OPTARG" ;; b) echo &q ...

随机推荐

  1. 学习MeteoInfo二次开发教程(十二)

    1.添加新的Form窗体: 在解决方案资源管理器中,右键MeteoInfoDemo,“添加”,“Windows 窗体” 2.新窗体中添加好layersLegend1和Layout之后,要把layers ...

  2. 洛谷题解 CF807A 【Is it rated?】

    同步题解 题目 好吧,来说说思路: 1.先读入啦~(≧▽≦)/~啦啦啦 2.判断a[i]赛前赛后是否同分数,如果分数不同,则输出,return 0 . 3.如果同分数,则判断a[i]赛前(或赛后)是否 ...

  3. 服务器后台代码生成TreeView的json字符串

    1.根据treeView控件的属性建立vo类 package cn.allen.tree.vo; import java.util.List; import java.util.Map; public ...

  4. Linux环境安装、卸载Docker

    安装: 1.Docker要求CentOS系统的内核版本高于 3.10 ,通过 uname -r 命令查看你当前的内核版本是否支持安账docker 2.更新yum包:sudo yum update 3. ...

  5. 69.纯 CSS 创作一个单元素抛盒子的 loader

    原文地址:https://segmentfault.com/a/1190000015470411#articleHeader0 HTML code: <div class="loade ...

  6. 6.3 基于二分搜索树、链表的实现的集合Set复杂度分析

    两种集合类的复杂度分析 在[6.1]节与[6.2]节中分别以二分搜索树和链表作为底层实现了集合Set,在本节就两种集合类的复杂度分析进行分析:测试内容:6.1节与6.2节中使用的书籍.测试方法:测试两 ...

  7. Springboot+ mybatis+ mysql配置@Slf4j

    spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver # 驱动 name: testDB # 配置名,可以随便写 userna ...

  8. Golang 包管理简介

    Golang 包管理 在一个项目里,如果想引用本地包,经常会把新手搞的莫名其妙.这里通俗记录一下. 首先先要知道几个默认的规则 必须定义环境变量GOPATH,GOPATH可以定义多个目录 所有项目代码 ...

  9. 【手记】MTK之TASK创建及使用

    首先来看看task的数据类型声明,在config\include\hal\task_config.h中对task和module类型进行了定义. /*************************** ...

  10. <mvc:resources mapping="/xxx/**" location="/xxx/"/>无效,可能和Controller的URL模式有关

    某项目webapp下有子目录res,其中有img.css.js等存放静态资源的文件夹. 在定义了dispacher-servlet的<url-pattern>/</url-patte ...