在 shell 脚本中间写入文件

在 shell 脚本中间写入文件

我的 Ubuntu 18.04 LTS 系统中有一个简单的 shell 脚本,在中间的某个地方,我想写一个包含一些指令的文件。我能够使用 echo 来实现这一点,但文本缩进

#!/bin/bash

for file in *x*x*
    do
        dir=${file%}
        dir=${dir%.*}
        mkdir -p "./$dir" &&
        mv -n "$file" "./$dir"
        echo "
            #!/bin/bash
            #SBATCH -o %j.o
            #SBATCH -e %j.e
            #SBATCH -t 01-00:00:00
            mpirun -n 24 castep.mpi $dir " > sub.sh
        mv -n sub.sh "./$dir"
done

我也尝试过这样的猫

 cat > sub.sh << EOF
   #!/bin/bash
   #SBATCH -o %j.o
   #SBATCH -e %j.e
   #SBATCH -t 01-00:00:00
   mpirun -n 24 castep.mpi $dir " > sub.sh
 EOF

但它给出了以下错误

 line 17: warning: here-document at line 9 delimited by end-of-file (wanted `EOF')

答案1

如果您希望在生成脚本中缩进行(以提高可读性),但不是在生成的脚本中缩进sub.sh,那么您可以使用此处的文档进行如下操作:

  1. 更改<<<<-

  2. 使用 TAB 字符缩进不是空格

如果您愿意,终止 EOF 也可以用 TAB 缩进。来自man bash

   If the redirection operator is <<-, then all leading tab characters are
   stripped  from  input  lines  and  the line containing delimiter.  This
   allows here-documents within shell scripts to be indented in a  natural
   fashion.

所以

cat > sub.sh <<- EOF
    #!/bin/bash
    #SBATCH -o %j.o
    #SBATCH -e %j.e
    #SBATCH -t 01-00:00:00
    mpirun -n 24 castep.mpi "$dir" > sub.sh
EOF

^^^^ these are tabs not spaces 

(我还删除了不平衡的双引号 - 大概是原始echo版本遗留下来的 - 而是用双引号括住$dir变量以防止可能发生的单词分裂。)

答案2

您可以尝试下一个:

    echo -e '
        #!/bin/bash
        #SBATCH -o %j.o
        #SBATCH -e %j.e
        #SBATCH -t 01-00:00:00
        mpirun -n 24 castep.mpi $dir " > sub.sh
    #mv -n sub.sh "./$dir' | tr -s "  "

我已将双引号替换为单引号,并添加了tr -s " "应删除缩进的内容。

相关内容