点击上方“Linux随笔录”,选择“置顶/星标公众号”

福利干货,第一时间送达

  • 前言
  • set的常用命令选项
  • 设置/取消 Shell 选项
  • 设置位置参数
  • 显示所有变量和函数
  • 处理带空格的参数
  • 调试脚本
  • 恢复默认选项
  • 错误退出
  • 总结

      不管我们是做嵌入式Linux研发人员,还是做运维人员,都会或多或少去查看编写 shell 脚本,你遇到问题是否也只会用一行一行echo去查看脚本分析问题。这样效率过于慢,今天教大家set关键字方法轻松分析遇到的问题

set的常用命令选项

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

设置/取消 Shell 选项

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

set -<option>  # 启用选项
set +<option>  # 禁用选项
  • 1.
  • 2.

常用选项

可以让你的shell脚本调试效率暴增的"set"方法_Shell

设置位置参数

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

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

示例

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

执行脚本结果如下

可以让你的shell脚本调试效率暴增的"set"方法_错误处理_02

显示所有变量和函数

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

set  # 显示所有变量
  • 1.

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

可以让你的shell脚本调试效率暴增的"set"方法_错误处理_03

处理带空格的参数

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

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

执行脚本结果如下

可以让你的shell脚本调试效率暴增的"set"方法_bash_04

调试脚本

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

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

打开调试效果如下

可以让你的shell脚本调试效率暴增的"set"方法_Shell_05

恢复默认选项

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

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

错误退出

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

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

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

执行脚本结果如下

可以让你的shell脚本调试效率暴增的"set"方法_错误处理_06

会发现脚本最后一行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"这行也不会执行"
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

看下执行脚本结果

可以让你的shell脚本调试效率暴增的"set"方法_错误处理_07

会发现打印两次错误发生在: 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"这行也不会执行"
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

查看脚本执行结果

可以让你的shell脚本调试效率暴增的"set"方法_错误处理_08

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

总结

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