如何编写Shell脚本执行Makefile?参数触发规则失效问题求助
解决Shell脚本触发Makefile规则的问题
看起来你脚本里有几个关键问题导致无法触发make bonus,咱们一步步来修正:
问题分析
- 条件判断语法错误:你写的
if [$1 == "bonus"]不符合Shell语法规范——[(这是test命令的别名)的前后必须加空格,而且POSIX标准下字符串比较应该用=而非==(虽然部分Shell支持==,但=兼容性更好)。另外,$1如果为空(比如用户没传参数),不加双引号会直接导致语法报错。 - 未实际执行make命令:你的脚本里只是
echo了命令,并没有真正调用make bonus,这就是为什么每次都只走默认逻辑的核心原因! - 逻辑顺序错误:原脚本在运行程序前执行
make clean,这会把刚生成的可执行文件删掉,直接导致./cub3D无法运行。
修正后的脚本
我调整了语法和逻辑顺序,你可以用这个版本:
#!/bin/bash # 先清理所有生成文件,确保从头构建 make fclean # 根据传入参数判断执行哪个Makefile规则 if [ "$1" = "bonus" ]; then echo "Building bonus version..." make bonus else echo "Building default version..." make fi # 运行编译好的程序 ./cub3D maps/1.cub # 程序运行完成后清理生成文件(可选,根据你的需求决定是否保留) make clean
额外优化(可选)
如果你用的是Bash,也可以用更灵活的[[语法(Bash扩展,支持==,处理空参数更友好):
#!/bin/bash make fclean if [[ "$1" == "bonus" ]]; then make bonus else make fi ./cub3D maps/1.cub make clean
最后一步
别忘了给脚本添加执行权限,否则没法直接运行:
chmod +x run.sh
现在运行./run.sh就会执行默认make,运行./run.sh bonus就会触发make bonus规则啦!
内容的提问来源于stack exchange,提问作者DarkSide77
相关产品推荐
相关产品推荐

