bash脚本创建脚本变量

时间:2017-08-04 20:02:37

标签: bash environment-variables

我试图创建一个创建脚本的脚本(并做其他事情)。我的问题是创建的这些脚本包含环境变量,当实际运行我的脚本时,它们不会出现在脚本中。

#!/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;?

2 个答案:

答案 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 <<!