You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建函数替代if-then-else简化脚本以减少代码行数?

实现精简版计数器函数

要把判断命令结果并递增计数器的3行代码压缩成1行调用,你可以写一个通用的shell函数,利用命令退出码和shell的算术表达式自动处理计数逻辑,完全替代if-then-else语句。

基础最简版本

先初始化全局计数器变量,再定义核心函数:

# 初始化计数器
success=0
failure=0

# 核心函数:执行命令并自动计数
count_result() {
    # 原样执行传入的命令(保留所有参数)
    "$@"
    # 用三元表达式根据退出码递增对应计数器
    (( $? == 0 ? success++ : failure++ ))
}

调用示例

原来的3行代码:

ls /tmp
if [ $? -eq 0 ]; then ((success++)); else ((failure++)); fi

现在直接写成1行调用:

count_result ls /tmp

完整测试脚本

#!/bin/bash

success=0
failure=0

count_result() {
    "$@"
    (( $? == 0 ? success++ : failure++ ))
}

# 测试不同命令的计数效果
count_result echo "Hello World"  # 成功,success+1
count_result ls /this/path/does/not/exist  # 失败,failure+1
count_result touch /tmp/test_file  # 成功,success+1
count_result rm /tmp/test_file  # 成功,success+1
count_result cat /nonexistent_file  # 失败,failure+1

# 输出最终统计结果
echo "✅ 成功次数: $success"
echo "❌ 失败次数: $failure"

进阶:自定义计数器名称(可选)

如果不想固定使用success和failure变量,也可以让函数接收自定义计数器变量名作为参数,灵活性更高:

count_result() {
    # 提取最后两个参数作为计数器变量名
    local success_var=${@: -2:1}
    local failure_var=${@: -1}
    # 提取前面的参数作为要执行的命令
    local cmd=("${@:1:$#-2}")
    
    # 执行目标命令
    "${cmd[@]}"
    # 根据退出码更新对应计数器(用间接引用实现变量名动态操作)
    if [ $? -eq 0 ]; then
        (( $success_var++ ))
    else
        (( $failure_var++ ))
    fi
}

调用方式示例:

# 自定义计数器变量
pass=0
fail=0

count_result ls /tmp pass fail
count_result ls /invalid pass fail

echo "通过次数: $pass, 失败次数: $fail"

这个函数彻底替代了冗余的if-then-else逻辑,每次调用仅需一行代码,完美匹配你精简脚本的需求。

内容的提问来源于stack exchange,提问作者Jakob Long

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:23:59