目录
Please enable Javascript to view the contents

bash脚本set命令说明

 ·  ☕ 2 分钟

重要

最重要的事:

1.简介

set 命令是 Bash 脚本的重要环节,却常常被忽视,导致脚本的安全性和可维护性出问题。此处记录基本用法。

2.使用

set命令用来修改 Shell 环境的运行参数,也就是定制环境。

顺便提一下,如果命令行下不带任何参数,直接运行set,会显示所有的环境变量和 Shell 函数

常用的四个命令如下

  • u, 忽略空变量
  • x, 调试 结果前打印命令
  • e, 发生错误,立即终止
  • o pipefail, 管道子命令发生错误,立即终止

2.1 忽略不存在变量

忽略 执行脚本 中 不存在的变量。

1
set -u

等同于

1
set -o nounset

2.2 在打印结果之前,先打印命令。

在运行结果之前,先输出执行的命令。

1
set -x

等同于

1
set -o xtrace

2.3 错误处理

Bash 命令执行失败,默认会继续执行后面的命令。

通过下面写法,当command有非零返回值,脚本就会停止执行。防止错误累积

1
command || exit 1

退出时,执行额外操作

1
command || { echo "command failed"; exit 1; }

等同于

1
if ! command; then echo "command failed"; exit 1; fi

等同于

1
if [ "$?" -ne 0 ]; then echo "command failed"; exit 1; fi

2.4 命令依赖

command1执行成功,再执行command2

1
command1 && command2

2.5 发生错误,立即终止

脚本只要发生错误,就终止执行。但对|管道失效,具体原因看 2.6 小节

1
set -e

等同于

1
set -o errexit

脚本后续命令,非空返回为执行成功。则需要临时关闭set -e,来让命令正常执行

1
2
3
4
5
6
7
8
9
#!/usr/bin/env bash
set -e
echo "初始设置 set -e 并执行命令"

## 临时关闭 set -e
set +e
echo "执行正常返回为非空的命令"
# 重新打开 set -e
set -e

也可以通过command || true的方式解决

1
2
3
4
5
6

#!/bin/bash
set -e

command || true
echo bar

2.6 子命令失败,整个管道命令就失败,脚本就会终止执行。

管道命令,就是多个子命令通过管道运算符|组合成为一个大的命令。Bash会把最后一个子命令的返回值,作为整个命令的返回值。
也就是说,只要最后一个子命令不失败,管道命令总是会执行成功,因此它后面命令依然会执行,set -e 就失效了。
例如

1
2
3
4
5
#!/usr/bin/env bash
set -e
# 由于下面`echo "test"`成功,命令永远不会中断
mc | echo "test"
echo bar

改为如下写法,解决管道问题

1
2
3
4
5
#!/usr/bin/env bash
set -eo pipefail

foo | echo a
echo bar

总结

上面参数总会一起使用

  • u, 忽略空变量
  • x, 调试 结果前打印命令
  • e, 发生错误,立即终止
  • o pipefail, 管道子命令发生错误,立即终止

比如

1
set -euxo pipefail

等同于

1
2
set -eux
set -o pipefail

等同于

1
bash -euxo pipefail script.sh

Reference

官方手册

Bash脚本set命令教程-阮一峰

分享

Hex
作者
Hex
CloudNative Developer