在我用来覆盖chk.sas文件的脚本下面,但不幸的是它只覆盖了chk中最后一个代码" run;" 的语句.sas文件。
#!/bin/bash
x=$(pwd)
echo "libname sasdata '$x';" > $x/chk.sas
echo "proc print data=sasdata.data ;" > $x/chk.sas
echo "run;" > $x/chk.sas
sas chk.sas
exit 0
下面是我期望从脚本中得到的结果,但我不确定我在脚本中的错误。
libname sasdata '/home/usr' ;
proc print data=sasdata.data ;
run;
提前感谢您的帮助。
答案 0 :(得分:0)
每次使用>
时,都会覆盖以前的文件。一种解决方案是使用>>
,这意味着追加。另一个解决方案是将所有echo命令组合在一起,只需使用>
一次:
#!/bin/bash
x=$(pwd)
{
echo "libname sasdata '$x';"
echo "proc print data=sasdata.data ;"
echo "run;"
} > "$x/chk.sas"
sas "$x/chk.sas"
除非您特别需要分词和路径名扩展,否则请将shell变量放在双引号内。因此,在上文中,我们使用"$x/chk.sas"
代替$x/chk.sas
。
如果您希望脚本返回成功退出代码,即使sas命令失败,也请使用exit 0
。如果省略exit
命令,脚本将以最后一个命令运行的退出代码退出(在本例中为sas)。无论代码调用脚本,这都可能提供更多信息。
将多行写入文件的另一种方法是使用 here-doc :
#!/bin/bash
x=$(pwd)
cat >"$x/chk.sas" <<EOF
libname sasdata '$x';
proc print data=sasdata.data ;
run;
EOF
sas "$x/chk.sas"
有关详细信息,请参阅man bash
中标题为 Here Documents 的部分。