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

本文介绍如何使用-n和-x选项调试shell脚本。通过-n检查语法错误,通过-x跟踪命令执行过程。示例展示了如何定位和修复常见错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

-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/bash
UID=`id |awk '{print $1}'|cut -f2 -d'='|awk -F '(' '{print $1}'`
isRoot()
{
    if [ "$UID" -ne 0 ]
        return 1
    else
        return 0
    fi
}

isRoot
if ["$?" -ne 0 ]
then
    echo "Must be root to run this script"
    exit 1
else
    echo "welcome root user"
fi

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

$ sh -n exp4.sh 
+ id
+ + cut -f2 -d=
awk -F ( {print $1}
+ awk {print $1}
+ UID=1000
exp4.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”这样的错误提示。只需在[号后面插入一个空格就一切正常了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值