2017-08-04 150 views
0

我想创建一个脚本来创建脚本(并做其他事情)。我的问题是创建的这些脚本包含环境变量,并且在实际运行脚本时,它们不会出现在脚本中。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”?

+0

@KevinMGranger,我不同意,这是一个很好的副本。问题不在于如何将heredoc写入文件,而是如何在进程中抑制变量扩展。 –

+0

@ KevinMGranger的建议的第一个被接受的答案有一个关于这里变量不被解释的文档的章节。 –

+0

@JotaBe,顺便说一句 - 一定要引用你的扩展。 'mkdir $ i'与* mkdir不同* $'“ - 即使你知道'i'总是数字,如果'IFS = 0'和'i = 102',那么'mkdir $ i' '会创建两个名为'1'和'2'的目录,而不是一个名为'102'的目录。 –

回答

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 
0

引用您的定界符印记,以防止扩张采取里面的内容的地方:

cat >job <<'!' 

......或者......

cat >job <<\! 

......不是......

cat >job <<! 
+0

这非常有帮助!我不知道你能阻止整个猫内部的扩张。但在这种情况下,我需要一个变量扩展“$我”,另一个不是。 –