Linux中shell脚本发现BUG和提高效率的神器—"set"方法
作者:Linux随笔录
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 -e
和set -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"方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!