Bash变量未正确解析求助:Makefile可运行脚本在Bash中失效
问题解决:Bash脚本中变量展开失效的原因与修复
你的脚本错误出在重定向语句的语法上,具体修正和原因如下:
错误根源
原代码中重定向部分多写了一个多余的cat命令:
cat ${DATA_DIR}/input_1/${i}.txt >> cat ${DATA_DIR}/input_0/${i}.txt
Bash会错误解析这个命令:它将前一个cat的输出尝试追加到名为cat的文件,同时把${DATA_DIR}/input_0/${i}.txt当作另一个需要读取的输入文件。命令结构混乱导致${i}在第二个路径中未正确展开,最终出现mydir/input_0/.txt not found的错误。
修正后的脚本
移除重定向后的多余cat,同时建议使用$(...)替代反引号(可读性更好),并给变量加引号避免路径含空格时出错:
#!/bin/bash DATA_DIR="mydir" for i in $(seq -f "%03g" 0 500) do cat "${DATA_DIR}/input_1/${i}.txt" >> "${DATA_DIR}/input_0/${i}.txt" done
补充说明
- Makefile的语法解析规则与Bash不同,原命令在Makefile中可能被正确解析,但Bash严格遵循命令行语法,重定向符号
>>后必须直接跟目标文件名,不能额外添加命令。 - 使用
"${变量}"的形式引用路径,可以避免路径中包含空格、特殊字符时出现解析错误。
内容的提问来源于stack exchange,提问作者Jenny I
相关产品推荐
相关产品推荐

