shell 脚本调试(使用shell的执行选项)

来源:互联网 发布:软文写作 知乎 编辑:程序博客网 时间:2024/05/22 12:20

-n 只读取shell脚本,但是不实际执行
常用于测试shell是否存在语法错误

-x 进入跟踪方式,显示所执行的每一条命令。
使shell在执行脚本的过程中把它实际执行的每一个命令行显示出来,并且在行首显示一个”+”号

-c “string” 从string中读取命令
使shell解释器从一个字符串中而不是从一个文件中读取并执行shell命令。当需要临时测试一小段脚本的执行结果时,可以使用这个选项,如下所示:
sh -c ‘a=1;b=2;let c=a+b;echo “c=$c”’

shell的执行选项除了可以在启动shell时指定外,亦可在脚本中用set命令来指定。 “set -参数”表示启用某选项,”set +参数”表示关闭某选项。有时候我们并不需要在启动时用”-x”选项来跟踪所有的命令行,这时我们可以在脚本中使用set命令,如以下脚本片段所示:
set -x    #启动”-x”选项
要跟踪的程序段
set +x     #关闭”-x”选项

示例:
以下是一个存在bug的shell脚本的示例,本文将用此脚本来示范如何用“-n”以及增强的“-x”执行选项来调试shell脚本。这个脚本中定义了一个函数isRoot(),用于判断当前用户是不是root用户,如果不是,则中止脚本的执行

$ cat –n exp4.sh#!/bin/bashUID=`id |awk '{print $1}'|cut -f2 -d'='|awk -F '(' '{print $1}'`isRoot(){    if [ "$UID" -ne 0 ]        return 1    else        return 0    fi}isRootif ["$?" -ne 0 ]then    echo "Must be root to run this script"    exit 1else    echo "welcome root user"fi

首先使用 -n 选项检查语法错误:

$ sh -n exp4.sh + id+ + cut -f2 -d=awk -F ( {print $1}+ awk {print $1}+ UID=1000exp4.sh: 8: exp4.sh: Syntax error: "else" unexpected (expecting "then")

发现一个语法错误,经过检查发现第4行的if 后面少了一个 then。改正之后在执行 sh -n,就没有语法错误了。

然后使用 -x 跟踪脚本

exp4.sh: 15: exp4.sh: [1: not found

经过检查发现 是 [号后面缺少了一个空格,导致[号与紧挨它的变量$?的值1被shell解释器看作了一个整体,并试着把这个整体视为一个命令来执行,故有“[1: command not found”这样的错误提示。只需在[号后面插入一个空格就一切正常了。

0 0
原创粉丝点击