Bash脚本中从字符串数组传入源文件至构建脚本报错求助
解决方法
错误原因分析
你之前的操作逻辑完全搞错了:
< "${SOURCE_AS_STR}"是告诉Bash去读取名为该字符串的文件,而非把字符串内容传给脚本,所以必然会报「No such file or directory」。- 用数组+heredoc出现「ambiguous redirect」,大概率是语法错误或误解了heredoc的用途——它是传递多行输入内容,不是传递命令行参数。
正确操作方式
场景1:构建脚本需要接收命令行参数(最常见)
直接将数组元素作为参数传递给脚本即可,Bash的数组展开"${SOURCES[@]}"会保留每个元素的原始格式(包括末尾的空格),不会被错误拆分:
# 1. 保留原数组声明(确保每个带空格的文件名都用双引号包裹) SOURCES=( "../../header1.h " "../../source1.cpp " "../../header2.h " "../../header3.h " "./main.cpp" ) # 2. 直接传递数组给构建脚本 bash my_build_script.sh "${SOURCES[@]}"
在构建脚本my_build_script.sh中,可通过$@获取所有传递的文件名参数,示例:
# my_build_script.sh 示例内容 for file in "$@"; do echo "处理文件:$file" # 此处编写你的构建逻辑 done
场景2:构建脚本需要从标准输入读取文件名列表
如果脚本是通过读取标准输入获取文件名(比如用while read循环),可以用printf把数组元素逐行输出,再通过管道传给脚本:
printf "%s\n" "${SOURCES[@]}" | bash my_build_script.sh
或者用heredoc传递(需转义文件名末尾的空格):
bash my_build_script.sh <<EOF ${SOURCES[@]// /\\ } EOF
内容的提问来源于stack exchange,提问作者zachaz35
相关产品推荐
相关产品推荐

