无法通过unix脚本正确覆盖文件

时间:2018-03-06 18:58:29

标签: shell

在我用来覆盖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;

提前感谢您的帮助。

1 个答案:

答案 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"

注释

  1. 除非您特别需要分词路径名扩展,否则请将shell变量放在双引号内。因此,在上文中,我们使用"$x/chk.sas"代替$x/chk.sas

  2. 如果您希望脚本返回成功退出代码,即使sas​​命令失败,也请使用exit 0。如果省略exit命令,脚本将以最后一个命令运行的退出代码退出(在本例中为sas)。无论代码调用脚本,这都可能提供更多信息。

  3. 替代方案:here-doc

    将多行写入文件的另一种方法是使用 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 的部分。