检查返回值
最后更新于:2022-04-02 03:52:50
[TOC]
## 概述
始终检查返回值并提供有用的返回值
## 简单判断
```
>cat a.sh
#!/bin/bash
rm 123 || exit 1
echo "success"
> touch 123
> bash a.sh
success
> bash a.sh
rm: 无法删除"123": 没有那个文件或目录
```
通过 || 符号判断上一条命令是否成功
## 失败时组合输出
```
rm 123 || ( echo "rm 123 失败" && exit 1 )
// 错误方式,不带括号,exit1 都会执行
rm 123 || echo "rm 123 失败" && exit 1
```
使用 `()` 进行组合
**case 的特殊情况**
1. 如果在case 中 不使括号,则可以正常退出 如` echo "失败" && exit 1`
2. 使用带括号的 exit 不会让整个程序停止,如 `rm 123 || ( echo "失败" && exit 1 )`
```
export A="b"
case $A in
"a")
# rm 123 || (echo "bb" && exit 1); //不会停止
rm 123
;;
esac
if (( $?!=0 ));then
echo "编译失败";
exit 1;
fi
echo "end"
```
### 非管道的简单命令
```
// 方式一:命令直接写在命令一
if ! mv "${file_list[@]}" "${dest_dir}/"; then
echo "Unable to move ${file_list[*]} to ${dest_dir}" >&2
exit 1
fi
// 方式一: 使用 $? 获取上次命令执行结果
mv "${file_list[@]}" "${dest_dir}/"
if (( $? != 0 )); then
echo "Unable to move ${file_list[*]} to ${dest_dir}" >&2
exit 1
fi
```
### 管道命令
如果仅需要判断整个管道符的
```
tar -cf - ./* | ( cd "${dir}" && tar -xf - )
if (( PIPESTATUS[0] != 0 || PIPESTATUS[1] != 0 )); then
echo "Unable to tar files to ${dir}" >&2
fi
```
对每个管道符进行判断
```
tar -cf - ./* | ( cd "${DIR}" && tar -xf - )
return_codes=( "${PIPESTATUS[@]}" )
// 注意使用 (( 而非 [[ 判断,因为 [ 也是一个命令
if (( return_codes[0] != 0 )); then
do_something
fi
if (( return_codes[1] != 0 )); then
do_something_else
fi
```
';