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命令)语法中存在两个关键错误:
- 字符串相等判断必须使用
==而非=,单等号会被解析为变量赋值而非比较 - 判断符号两侧必须添加空格,否则会被视为字符串拼接,导致条件永远为真,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
相关产品推荐
相关产品推荐

