跳到正文

返回码与条件 ​

返回码是命令之间最基础的通信方式:0 成功,非 0 失败,后面的逻辑都建在这一个字节上。

基础 ​

概念说明
成功返回 0
失败返回 1–255
$?上一条命令的返回码
exit N指定脚本返回码
截断exit 256 实际是 0
信号128 + 信号编号,如 137、130

短路 ​

bash
grep -q pattern file && echo found
grep -q pattern file || echo missing
  • && 左边成功才执行右边
  • || 左边失败才执行右边
  • if、while 判断的也是返回码

条件 ​

写法说明
[ -f f ]test 命令,两侧要空格
[[ -f f ]]bash 语法,支持 &&、`
[ "$a" = "$b" ]字符串
[ "$n" -eq 3 ]数值
! cmd取反

管道 ​

bash
false | true | false
echo "${PIPESTATUS[@]}"   # 1 0 1
设置效果
默认只看最后一段
set -o pipefail任一段失败即失败
PIPESTATUS每段的具体返回码

set -e 的边界 ​

  • if cmd; then 里的 cmd 失败不退出
  • cmd && ... 左值失败不退出
  • ! cmd 不退出
  • 子 Shell 和命令替换里的失败未必传出来

重要的检查仍然要显式 || exit 1,或者 trap ... ERR。

case ​

bash
case "$1" in
  start|stop) systemctl "$1" app ;;
  *) echo "usage: $0 start|stop" >&2; exit 2 ;;
esac

CI 和脚本自动化全靠返回码决定是否继续,不要用 exit 0 掩盖错误。