如何在Linux Makefile中初始化并遍历数组(含目录文件数组需求)
解决Makefile中bash数组语法报错的问题
嘿,我来帮你搞定这个问题!你遇到的错误是因为Make默认使用POSIX标准的/bin/sh来执行shell命令,而declare -a这类数组语法是bash独有的特性,并不是sh支持的标准语法,所以才会抛出「Syntax error: "(" unexpected」的错误。下面给你两种靠谱的解决方案:
方案一:全局指定Make使用bash
在你的Makefile最开头加上这一行,强制所有shell命令都用bash执行:
SHELL := /bin/bash
然后你的目标就可以正常使用bash数组语法了,修正后的完整示例:
SHELL := /bin/bash all: declare -a arr=(a b c) ;\ echo "$${arr[1]}" ;\ for key in $${arr[@]} ; do \ echo "正在处理目录:$$key" ;\ # 这里可以添加你的find命令,比如:find $$key -type f ;\ done
这里要注意两个关键点:
- Makefile里的
$$是对$的转义,因为Make会优先解析$符号,所以数组引用要写成$${arr[@]},循环变量要写成$$key - 每行命令末尾的
;\是Makefile的换行续行符,确保整个shell脚本被当作一个完整的块执行
方案二:给单个目标单独指定bash执行
如果你不想全局修改Make的默认shell,也可以在单个目标里直接调用bash来执行脚本块:
all: /bin/bash -c 'declare -a arr=(a b c); echo "${arr[1]}"; for key in "${arr[@]}"; do echo "正在处理目录:$$key"; find $$key -type f; done'
这种方式把整个bash脚本用单引号包裹,通过bash -c直接执行,完全避开了Make对shell语法的干扰。
内容的提问来源于stack exchange,提问作者Viacheslav On
相关产品推荐
相关产品推荐

