我试图创建一个创建脚本的脚本(并做其他事情)。我的问题是创建的这些脚本包含环境变量,当实际运行我的脚本时,它们不会出现在脚本中。
#!/bin/bash
for i in {001..116}
do
rm job
cat > job <<!
#PBS -S /bin/bash
#PBS -N $i-Fe63S
#PBS -j oe
#PBS -q default
#PBS -l nodes=1:ppn=24
#PBS -l walltime=48:00:00
#PBS -V
cd $PBS_O_WORKDIR
/opt/openmpi/bin/mpirun -np 24 /opt/vasp/5.4/vasp.5.4.1/bin/vasp_std > log
!
mkdir $i
cp job $i/
done
在结果&#34;工作&#34;文件已创建,它会尝试,但无法找到$ PBS_O_WORKDIR,因此生成的脚本为
#PBS -S /bin/bash
#PBS -N 116-Fe63S
#PBS -j oe
#PBS -q default
#PBS -l nodes=1:ppn=24
#PBS -l walltime=48:00:00
#PBS -V
cd
/opt/openmpi/bin/mpirun -np 24 /opt/vasp/5.4/vasp.5.4.1/bin/vasp_std > log
我如何修改脚本,因此结果脚本中的行被写入&#34; cd $ PBS_O_WORKDIR&#34;而不是&#34; cd&#34;?
答案 0 :(得分:1)
浏览此处文档中的变量/表达式,并在编写文件时转义那些您不希望展开的变量/表达式。
在这种情况下,您希望$i
现在展开,$PBS_O_WORKDIR
稍后展开,以便您逃避后者:
#!/bin/bash
for i in {001..116}
do
rm job
cat > job <<!
#PBS -S /bin/bash
#PBS -N $i-Fe63S
#PBS -j oe
#PBS -q default
#PBS -l nodes=1:ppn=24
#PBS -l walltime=48:00:00
#PBS -V
cd \$PBS_O_WORKDIR # <- Escaped
/opt/openmpi/bin/mpirun -np 24 /opt/vasp/5.4/vasp.5.4.1/bin/vasp_std > log
!
mkdir $i
cp job $i/
done
答案 1 :(得分:0)
引用你的heredoc sigil以防止在内容中发生扩展:
cat >job <<'!'
...或...
cat >job <<\!
...不...
cat >job <<!