Linux中shell脚本发现BUG和提高效率的神器—"set"方法

 更新时间:2025年08月30日 12:00:19   作者:Linux随笔录  
set是 Linux Shell 中的一个内置命令,用于设置或显示 shell 的选项和环境变量,以下是关于 set 命令的基础概念、优势、类型、应用场景以及常见问题的解答,嵌入式Linux研发人员和运维人员,都会或多或少去查看编写 shell 脚本,今天教大家set关键字方法轻松分析遇到的问题

      set是 Linux Shell 中的一个内置命令,用于设置或显示 shell 的选项和环境变量。以下是关于 set 命令的基础概念、优势、类型、应用场景以及常见问题的解答。不管我们是做嵌入式Linux研发人员,还是做运维人员,都会或多或少去查看编写 shell 脚本,你遇到问题是否也只会用一行一行echo去查看脚本分析问题。这样效率过于慢,今天教大家set关键字方法轻松分析遇到的问题

set的常用命令选项

set 用于设置或取消设置 Shell 选项、位置参数,以及显示变量和函数定义。它的用法非常广泛,主要包括以下几个方面:

设置/取消 Shell 选项

  • 显示变量‌:不带参数时,set会列出当前Shell的所有变量(包括环境变量)和函数定义13。
  • 设置选项‌:通过-+启用/禁用Shell特性(如调试、错误处理等)14。
    • -:开启选项(如set -x启用命令调试)
    • +:关闭选项(如set +x关闭调试)14。

set 可以启用或禁用 Shell 的运行选项,语法如下:

set -<option>  # 启用选项
set +<option>  # 禁用选项

常用选项

设置位置参数

set 可以重新设置脚本的位置参数:

set -- arg1 arg2 arg3  # 设置 $1="arg1", $2="arg2", $3="arg3"

示例

set -- "first" "second" "third"
echo "$1"  # 输出 "first"
echo "$2"  # 输出 "second"

执行脚本结果如下

显示所有变量和函数

不带参数的 set 会显示所有变量:

set  # 显示所有变量

ubuntu上的环境变量都可以打印出来,脚本里的变量打印不出来

处理带空格的参数

set 可以正确处理带空格的参数:

set -- "Hello World" "Bash Script"
echo "$1"  # 输出 "Hello World"(保留引号)

执行脚本结果如下

调试脚本

set -x 和 set -v 常用于调试

#!/bin/bash
set -x  # 打印执行的命令
echo "Debug mode"
set +x  # 关闭调试

打开调试效果如下

恢复默认选项

set -  # 恢复所有选项为默认值

顾名思义就是将之前的 set 的参数改回默认选项

错误退出

set -e 常用于一个命令返回一个非0退出状态值(失败),就立刻退出

下面举一个单独使用set -e的例子

#!/bin/bash
set -e  # 启用错误退出
 
echo "第一行正常执行"
ls /home/forlinx/1.txt  # 这个命令会失败
echo "这行不会被执行,因为脚本已经退出"

执行脚本结果如下

会发现脚本最后一行echo没有打印出来

set -E 常和trap函数结合一起使用更容易发现脚本里哪条指令发生错误

下面举个set -E的例子

#!/bin/bash
set -eE  # 同时启用错误退出和错误追踪

# 设置错误处理函数
trap'echo "错误捕获: 在行号 $LINENO, 命令: $BASH_COMMAND, 状态码: $?"' ERR

my_function() {
    echo"在函数内执行"
    ls /不存在的目录  # 这里会失败
    echo"这行不会执行"
}

echo"脚本开始"
my_function
echo"这行也不会执行"

看下执行脚本结果

会发现打印两次错误发生在: ls /home/pan 便于开发者更容易发现到哪条指令发生错误

在项目中,set -eset -E更多是在一起使用,便于更方便调试脚本,这样更快速定位到哪条指令发生问题退出脚本

#!/bin/bash
set -eE  # 同时启用错误退出和错误追踪

# 设置错误处理函数
trap'echo "错误捕获: 在行号 $LINENO, 命令: $BASH_COMMAND, 状态码: $?"' ERR

my_function() {
    echo"在函数内执行"
    ls /不存在的目录  # 这里会失败
    echo"这行不会执行"
}

echo"脚本开始"
my_function
echo"这行也不会执行"

查看脚本执行结果

会发现确实比set -e时错误提示更加明显,会多提示一行错误发生的指令

注意事项‌

  • 选项可组合使用(如set -eu);
  • 子Shell继承父Shell的选项设置,但修改不影响父Shell;
  • 恢复默认选项可用set +选项(如set +x)。

总结

本篇我们学会了常用的set关键字语法可以让你的 shell 脚本提高更改 bug 调试效率,本篇学会的同学可以一键支持三连下,欢迎关注公众号[Linux随笔录],持续分享干货!

到此这篇关于Linux中shell脚本发现BUG和提高效率的神器—"set"方法的文章就介绍到这了,更多相关Linux中shell脚本"set"方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • shell命令行参数用法简介

    shell命令行参数用法简介

    本文介绍了shell命令行参数的用法,对于普通脚本语言诸如perl python等,写一个脚本程序,包装命令行参数时,一般都是用getopt之类的;c语言也类似
    2014-04-04
  • shell脚本查看k8s日志介绍

    shell脚本查看k8s日志介绍

    大家好,本篇文章主要讲的是shell脚本查看k8s日志介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • 浅析使用 Auditbeat 模块监控 shell 命令的问题

    浅析使用 Auditbeat 模块监控 shell 命令的问题

    Auditbeat Audited 模块可以用来监控所有用户在系统上执行的 shell 命令,在终端用户偶尔才会登录的服务器上,通常需要进行监控,本文给大家介绍使用 Auditbeat 模块监控 shell 命令的相关知识,感兴趣的朋友一起看看吧
    2022-02-02
  • shell进程监控的实现(ps、sleep、kill)

    shell进程监控的实现(ps、sleep、kill)

    本文主要介绍了shell进程监控的实现(ps、sleep、kill),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • 提取oralce当天的alert log的shell脚本代码

    提取oralce当天的alert log的shell脚本代码

    提取oralce当天的alert log的shell脚本代码,需要的朋友可以参考下
    2013-02-02
  • shell字符串比较判断是否为数字

    shell字符串比较判断是否为数字

    本文阐述:shell中整数比较方法及字符串的比较方法,如等于,不等于,大于,大于等于,小于,等等
    2013-01-01
  • 写一个shell脚本实现视频处理

    写一个shell脚本实现视频处理

    Linux和Unix都拥有很多能够处理图像和视频文件的应用程序和工具,下面这篇文章主要给大家介绍了关于如何写一个shell脚本来实现视频处理的相关资料,需要的朋友可以参考下
    2022-07-07
  • Linux 连续执行多条命令的方法(推荐)

    Linux 连续执行多条命令的方法(推荐)

    下面小编就为大家带来一篇Linux 连续执行多条命令的方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • shell脚本case语句的具体使用

    shell脚本case语句的具体使用

    Shell脚本中的case语句是一种多分支条件判断结构,主要用于匹配变量值与预设模式并执行对应的命令序列,下面就来具体介绍一下case语句的具体使用
    2025-08-08
  • linux C语言开发管道通信实例详解

    linux C语言开发管道通信实例详解

    这篇文章主要介绍了linux C语言开发管道通信实例详解的相关资料,需要的朋友可以参考下
    2017-01-01

最新评论