如何在SAS宏中执行Unix的read命令?脚本执行异常求助
问题根源分析
你的脚本里的核心问题在于每个%sysexec都会启动一个独立的Unix子shell进程:
- 第二个
%sysexec ( read sub )中读取的sub变量,只存在于这个子shell的局部环境里 - 第三个
%sysexec是一个全新的子shell,完全看不到之前定义的sub变量,所以输出的[$sub]自然是空的或者未定义的
解决方案
下面提供几种可行的解决思路,你可以根据实际需求选择:
方案1:合并shell命令到同一个%sysexec中
如果只是需要在shell层面输出结果,不需要把sub传入SAS宏变量,可以把所有shell命令打包到一个%sysexec里,这样它们共享同一个shell环境:
%macro read; %sysexec( echo -n "Sub setting condition:" read sub echo "Checking the macro [$sub]" ); %mend; %read;
三个命令在同一个shell进程中执行,sub变量就能被后续的echo正确引用。
方案2:用SAS原生方式读取终端输入(推荐)
如果需要把输入内容变成SAS宏变量供后续代码使用,直接用SAS的infile读取终端输入是更可靠的方式,无需依赖shell命令:
%macro read; /* 提示用户输入 */ %put Sub setting condition:; /* 建立管道连接终端输入 */ filename terminal pipe 'cat'; data _null_; /* 读取终端输入的内容 */ infile terminal length=input_len; input input_line $varying200. input_len; /* 将读取内容定义为SAS宏变量sub */ call symputx('sub', input_line); run; /* 关闭管道 */ filename terminal clear; /* 输出验证结果 */ %put Checking the macro [&sub.]; %mend; %read;
这个方案跨平台(调整pipe后的命令也能在Windows上运行),且变量直接进入SAS环境,方便后续SAS代码复用。
方案3:通过临时文件传递变量
如果一定要保留shell的read逻辑,可以把读取的变量写入临时文件,再让SAS从文件中读取并定义宏变量:
%macro read; %sysexec( echo -n "Sub setting condition:" read sub # 将变量写入临时文件 echo "$sub" > /tmp/sub_temp.txt ); /* 从临时文件读取内容并定义宏变量 */ data _null_; infile '/tmp/sub_temp.txt'; input sub_value $200.; call symputx('sub', sub_value); run; /* 输出验证结果 */ %put Checking the macro [&sub.]; /* 清理临时文件 */ %sysexec(rm /tmp/sub_temp.txt); %mend; %read;
这个方案适合需要在shell中做额外逻辑处理后,再把结果传递给SAS的场景。
内容的提问来源于stack exchange,提问作者MPUSA
相关产品推荐
相关产品推荐

