set 命令
最后更新于:2022-04-02 03:53:55
[TOC]
## 总结
set命令的四个参数,一般都放在一起使用
这两种写法建议放在所有 Bash 脚本的头部。
```
# 写法一
set -euxo pipefail
# 写法二
set -eux
set -o pipefail
```
## set -u 未定义变量报错
若使用未定义的变量默认不报错
脚本在头部加上它,遇到不存在的变量就会报错,并停止执行
```
#!/usr/bin/env bash
set -u
echo $a
```
## set -x / set +x 打印执行语句 / 关闭输出
在运行结果之前,先输出执行的那一行命令
```
#!/usr/bin/env bash
set -x
echo bar
```
输出
```
$ bash script.sh
+ echo bar
bar
```
set +x 关闭输出
```
#!/bin/bash
number=1
set -x
if [ $number = "1" ]; then
echo "Number equals 1"
else
echo "Number does not equal 1"
fi
set +x
```
## Bash 的错误处理
```
command || exit 1
```
### 停止后进行多步处理
```
# 写法一
command || { echo "command failed"; exit 1; }
# 写法二
if ! command; then echo "command failed"; exit 1; fi
# 写法三
command
if [ "$?" -ne 0 ]; then echo "command failed"; exit 1; fi
```
## set -e / set +e 脚本只要发生错误,就终止执行
```
#!/usr/bin/env bash
set -e
foo
echo bar
```
某些命令的非零返回值可能不表示失败,这时可以暂时关闭set -e,该命令执行结束后,再重新打开set -e
### set -o pipefail
多个子命令通过管道运算符(|)组合成为一个大的命令。
Bash 会把最后一个子命令的返回值,作为整个命令的返回值。
也就是说,只要最后一个子命令不失败,管道命令总是会执行成功,因此它后面命令依然会执行,set -e就失效了
使用 `set -o pipefail` 可以解决这个问题
';