我想创建一个脚本来创建脚本(并做其他事情)。我的问题是创建的这些脚本包含环境变量,并且在实际运行脚本时,它们不会出现在脚本中。bash脚本创建脚本变量
#!/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
在创建的结果“工作”文件,它会尝试,但未能找到$ 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
如何修改剧本,所以线结果脚本写成“cd $ PBS_O_WORKDIR”而不是“cd”?
@KevinMGranger,我不同意,这是一个很好的副本。问题不在于如何将heredoc写入文件,而是如何在进程中抑制变量扩展。 –
@ KevinMGranger的建议的第一个被接受的答案有一个关于这里变量不被解释的文档的章节。 –
@JotaBe,顺便说一句 - 一定要引用你的扩展。 'mkdir $ i'与* mkdir不同* $'“ - 即使你知道'i'总是数字,如果'IFS = 0'和'i = 102',那么'mkdir $ i' '会创建两个名为'1'和'2'的目录,而不是一个名为'102'的目录。 –