【Linux】一线真实使用的Shell调试脚本方法

本文介绍了在Shell脚本中使用set-x进行命令追踪,echo打印输出,shellcheck进行静态检查,以及通过echo和log函数实现的日志记录和错误处理。提供了一套系统化的Shell脚本调试步骤和工具应用。
摘要由CSDN通过智能技术生成

结论先行:

1. set -x的方式

2. echo打印的方式

3. log打日志的方式

set -x

在Shell脚本中,`set -x`是一个用于调试的命令。当这个命令被启用时,它会打印出每一条执行的命令及其参数。这对于追踪脚本中的错误和理解脚本的行为非常有用。

例如,如果你有一个简单的脚本:

```bash
#!/bin/bash
echo "Hello, World!"
```

当你运行这个脚本时,你不会看到任何输出,因为`echo`命令没有被启用。但是,如果你在脚本的开头添加`set -x`,那么当你再次运行这个脚本时,你会看到以下输出:

```bash
+ echo 'Hello, World!'
Hello, World!
```

在这个输出中,`+`表示这是一个被追踪的命令,而`Hello, World!`是该命令的输出。这样,你可以看到每个命令的执行情况,从而更容易找到并修复问题。

echo打印+shellcheck静态检查

调试Shell脚本可能比你想象的要复杂,因为它与其他高级语言(如Python或Java)不同。Shell脚本更像是命令的集合,而不是真正的程序。然而,仍然有一些方法可以帮助你调试你的Shell脚本。

第一步:理解你的脚本

首先,你需要理解你的脚本在做什么。如果你不熟悉Shell脚本,那么你应该花点时间学习一下。这包括了解基本的Shell命令、如何编写条件语句和循环等。

第二步:使用echo语句进行调试

在你的脚本中添加`echo`语句来显示变量的值或者是在关键点打印出一些有用的信息。例如,如果你正在尝试解析一个文件,你可以添加`echo`语句来显示你正在处理的当前行。

第三步:使用set -x进行调试

在你的脚本的开头添加`set -x`命令,这会让你的脚本在执行时显示每一条命令及其参数。这样,你可以看到你的脚本到底在做什么,以及哪些命令失败了。

第四步:使用shellcheck进行静态代码分析

shellcheck是一个Shell脚本的静态代码分析工具,它可以找出你的脚本中的错误和潜在问题。你可以从它的GitHub页面下载并安装这个工具。

第五步:使用调试器

如果你对脚本的内部工作原理很感兴趣,你也可以使用调试器,如bashdb。这个工具允许你在脚本的任何一行设置断点,然后逐步执行你的脚本,查看变量的值等。

第六步:阅读错误消息

当你运行你的脚本时,如果出现错误,请仔细阅读错误消息。错误消息通常会告诉你错误发生的位置,以及可能的原因。

第七步:使用日志记录

如果你需要更详细的调试信息,你可以添加日志记录到你的脚本中。这可以让你跟踪你的脚本的执行过程,以及每个步骤的结果。

最后,记住,调试Shell脚本可能需要一些时间和耐心。但是,只要你遵循这些步骤,你就可以找到并修复你的脚本中的错误。

日志记录的方法

log() {
  # shellcheck disable=SC2145
  echo "$(date +%Y-%m-%d\ %H:%M:%S) info $@" >> $logFilePath/a.log
}

log() {
  # shellcheck disable=SC2145
  echo "$(date +%Y-%m-%d\ %H:%M:%S) info $@"
}

errlog() {
  # shellcheck disable=SC2145
  echo "$(date +%Y-%m-%d\ %H:%M:%S) error $@"
}

warnlog() {
  # shellcheck disable=SC2145
  echo "$(date +%Y-%m-%d\ %H:%M:%S) warning $@"
}

function log(){
    if [ -z "$log_path" ]; then
        log_path=/var/log/$SERVICE_NAME
    fi
 
    if [ ! -d $log_path ]; then
        mkdir -p $log_path
    fi
 
    local target=$log_path/$log_file
    if [ ! -f $target ]; then
        touch $target
    fi
 
    log_text="`date +%Y-%m-%d\ %T` [$SERVICE_NAME] $1"
 
    echo "$log_text" >> $target
}
 
function clearLog(){
    if [ -z "$log_path" ]; then
         log_path=/var/log/$SERVICE_NAME
    fi
 
    if [ ! -d $log_path ]; then
        mkdir -p $log_path
    fi
 
    local target=$log_path/$log_file
    if [ -f $target ]; then
        rm -rf $target
    fi
}
  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值