布尔函数应以is_、has_、can_开头命名,专注单一职责,统一用return 0/1表示真假,显式处理参数校验与边界情况,使业务逻辑意图清晰、易于维护。

把多个微小判断封装成布尔函数,核心是让业务逻辑“一眼看懂意图”,而不是堆砌条件表达式。比如 if [[ -f "$file" && -r "$file" && $(stat -c "%s" "$file") -gt 0 ]] 这种写法,不如换成 if is_valid_input_file "$file"; then —— 重点不在“怎么写”,而在“怎么让人放心读、安心改”。
布尔函数命名要直说“是不是”
函数名必须以 is_、has_、can_ 开头,后面紧跟明确的名词短语,不带缩写、不模糊:
-
is_valid_config_path✅(路径存在、可读、是普通文件、非空) -
has_required_commands✅(检查 curl、jq、grep 是否都可用) -
can_write_to_dir✅(目录存在、可写、且不是只读挂载) -
check_conf❌(动词开头,看不出返回真假) -
validconf❌(缩写歧义,且没 is_ 前缀)
内部实现要专注单一职责
每个布尔函数只解决一个具体问题,不拼凑多个无关判断。哪怕逻辑简单,也值得封装:
- 用
[[ -n "$var" ]] && [[ "$var" =~ ^[0-9]+$ ]]判断是否为非空数字?→ 封装为is_positive_integer - 检查某进程是否在运行:
pgrep -x "$proc_name" > /dev/null→ 封装为is_process_running - 确认配置项是否启用:
[[ "${ENABLE_FEATURE:-0}" == "1" ]]→ 封装为is_feature_enabled
所有判断结果统一用 return 0 表示真,return 1 表示假,不 echo 任何内容,也不依赖 $? 以外的状态。
Shell本身是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。它虽然不是Linux系统核心的一部分,但它调用了系统核心的大部分功能来执行程序、建立文件并以并行的方式协调各个程序的运行。因此,对于用户来说,shell是最重要的实用程序,深入了解和熟练掌握shell的特性极其使用方法,是用好Linux系统
参数校验和默认行为要显式声明
布尔函数不是黑盒。调用前就该知道它对输入的要求:
- 必填参数缺失时直接
return 2(或die "missing arg: file"),不静默失败 - 空字符串、null 值等边界情况要有明确定义,比如
is_valid_input_file ""应明确返回 false - 避免隐式依赖全局变量,所有输入都通过
$1、$2传入;必要时用local var="$1"隔离作用域
业务代码里用布尔函数替代嵌套条件
主流程中不再出现复杂 test 表达式,而是靠函数名传达语义:
# 改写前(难读、难改、难测) if [[ -d "$log_dir" ]] && [[ -w "$log_dir" ]] && [[ $(ls -A "$log_dir" 2>/dev/null | wc -l) -eq 0 ]]; then cleanup_old_logs fi <h1>改写后(意图清晰,逻辑隔离)</h1><p>if is_empty_writable_dir "$log_dir"; then cleanup_old_logs fi</p>
后续如果“空目录”定义变了(比如允许存在 .keep 文件),只需改 is_empty_writable_dir 内部,业务代码完全不动。










