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

Makefile循环中if-else分支失效问题求助

Makefile循环打包分支失效问题修复

问题描述

遍历dir目录下的一级子目录,编译对应目录下的Go代码生成bootstrap文件;仅对dir/task1和dir/task2目录,将bootstrap与resources/目录一起打包,其他目录仅打包bootstrap。但执行make build时,else分支始终不生效。

原代码

build:
    for directory in $$(find dir -mindepth 1 -maxdepth 1 -type d) ; \
        do env GOOS=linux go build -ldflags="-s -w" -o "bootstrap" $${directory}/main.go ; \
            if [ $${directory}='dir/task1' ] || [ $${directory}='dir/task2' ]; then \
                zip -r $${directory}.zip bootstrap resources/ ; \
            else \
                zip $${directory}.zip bootstrap ; \
            fi \
        done

错误原因

Bash的[(test命令)语法中存在两个关键错误:

  1. 字符串相等判断必须使用==而非=,单等号会被解析为变量赋值而非比较
  2. 判断符号两侧必须添加空格,否则会被视为字符串拼接,导致条件永远为真,else分支无法触发

修正后的代码

build:
    for directory in $$(find dir -mindepth 1 -maxdepth 1 -type d) ; \
        do env GOOS=linux go build -ldflags="-s -w" -o "bootstrap" $${directory}/main.go ; \
            if [ "$${directory}" == "dir/task1" ] || [ "$${directory}" == "dir/task2" ]; then \
                zip -r $${directory}.zip bootstrap resources/ ; \
            else \
                zip $${directory}.zip bootstrap ; \
            fi \
        done

额外优化建议

  • 给变量${directory}添加双引号,避免目录名包含空格时出现解析错误
  • 可以用case语句替代多个||判断,提升代码可读性:
build:
    for directory in $$(find dir -mindepth 1 -maxdepth 1 -type d) ; \
        do env GOOS=linux go build -ldflags="-s -w" -o "bootstrap" $${directory}/main.go ; \
            case "$${directory}" in \
                dir/task1|dir/task2) \
                    zip -r $${directory}.zip bootstrap resources/ ;; \
                *) \
                    zip $${directory}.zip bootstrap ;; \
            esac \
        done

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 08:43:12