【发布时间】:2017-08-04 20:02:37
【问题描述】:
我正在尝试创建一个脚本来创建脚本(并执行其他操作)。我的问题是创建的这些脚本包含环境变量,而在实际运行我的脚本时,它们并没有出现在脚本中。
#!/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"相同——即使您知道i始终是数字,如果IFS=0和i=102然后mkdir $i将创建两个名为@ 的目录987654329@ 和2,没有一个名为102的目录。 -
删除了我的欺骗评论,因为本杰明的建议更好。
标签: bash environment-variables