我的 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
,那么您可以使用此处的文档进行如下操作:
更改
<<
为<<-
使用 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 " "
应删除缩进的内容。