【问题标题】:bash script create script variable [duplicate]bash脚本创建脚本变量[重复]
【发布时间】: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=0i=102 然后mkdir $i 将创建两个名为@ 的目录987654329@ 和 2,没有一个名为 102 的目录。
  • 删除了我的欺骗评论,因为本杰明的建议更好。

标签: bash environment-variables


【解决方案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

【讨论】:

    【解决方案2】:

    引用您的heredoc sigil 以防止在内容中发生扩展:

    cat >job <<'!'
    

    ...或...

    cat >job <<\!
    

    ...不是...

    cat >job <<!
    

    【讨论】:

    • 这很有帮助!我不知道你可以像这样阻止整个猫内部的扩展。但在这种情况下,我需要一个变量扩展“$i”,而另一个不需要。
    猜你喜欢
    • 1970-01-01
    • 2021-08-22
    • 2021-08-29
    • 2018-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多