Unix环境下Awk脚本调用gfortran编译程序失败求助
我帮你拆解下问题根源,然后给出具体的修复步骤:
首先,先解决一个致命的脚本语法错误
看你贴的脚本代码,BEGIN块末尾写了exit——这会让Awk在初始化完成后直接退出,后面的循环和逻辑根本不会执行!这应该是你粘贴时的格式失误,先把这个错误修复,正确的BEGIN块应该是:
BEGIN { is_windows = 0; if (index(tolower(ENVIRON["OS"]), "windows") > 0) { is_windows = 1; } }
移除那个多余的exit,脚本才能正常执行后续逻辑。
核心问题:Unix下换行符的传递错误
这是导致iri_unix.exe报Bad real number的关键原因:
在Awk中,字符串里的\n会被直接解析成实际的换行字符,而不是字面的\n符号。当你构造cmdline传递给shell时,shell会把包含实际换行的参数拆分成多个片段,echo -e会把这些片段用空格拼接起来输出——最终传递给iri_unix.exe的是一行空格分隔的内容,而不是程序期望的三行输入,这就导致Fortran程序读取数据时格式完全错误。
对比你直接在bash中执行的命令,你传递给echo -e的是包含字面\n的字符串,所以能正确输出换行,这就是两者的差异。
修复方案一:转义换行符,让shell收到字面\n
修改pipe变量的构造,把\n改成\\n,这样Awk会输出字面的\n字符,shell的echo -e就能正确解析为换行:
pipe= "\"" j "," i ",0.300\\n2017,823,0,12.750\\n20200" "\""
修改后,Unix下生成的cmdline会和你直接在bash中执行的命令完全一致,echo -e会输出正确的三行内容给iri_unix.exe。
修复方案二:使用printf替代echo -e(更可靠)
echo -e的行为在不同shell中可能存在差异,而printf是标准化工具,用它生成换行更稳定。修改Unix分支的cmdline构造:
else cmdline = "printf '" j "," i ",0.300\n2017,823,0,12.750\n20200\n' | ./iri_unix.exe"
这里用单引号包裹printf的格式字符串,单引号内的\n会被printf直接解析为换行,不需要额外转义,同时避免了引号嵌套的问题,代码更简洁可靠。
额外注意事项
- 确保每次执行完管道后调用
close(cmdline),你已经做了这一点,这很重要,可以避免Awk耗尽文件描述符。 - 在Unix环境下,确保
./iri_unix.exe有可执行权限,执行chmod +x iri_unix.exe即可设置。
按照上面的步骤修改后,脚本应该就能在Unix环境下和Windows环境一样正常运行了。
内容的提问来源于stack exchange,提问作者user1677716

