如何创建函数替代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
相关产品推荐
相关产品推荐

