评论中的变量扩展

时间:2013-02-05 17:02:00

标签: bash preprocessor sungridengine

是否可以在bash脚本中的注释中扩展变量?

我想编写一个脚本以提供给SGEqsub语法允许我使用以#$开头的bash脚本中的行将其他参数传递给网格引擎。例如,

#$ -q all.q
#$ -S /bin/bash
#$ -V
#$ -m beas
#$ -o run_20120103.out

我想要的是-o参数动态设置为变量,比如$1。所以我会天真地写

#$ -o run_${1}.out

但是,由于该行以#开头,bash会忽略该行,并且不会展开变量$1

有什么想法吗?一些bash预处理器?其他一些方式?

编辑我刚才选择了$1作为示例。它也可以是$FOO$BAR

3 个答案:

答案 0 :(得分:4)

变量扩展发生在shell内存中,它不会影响文件。因此,bash扩展并不重要。

相反,您可以生成要在运行中运行的脚本,并将所有内容扩展到位:

cat << EOF | qsub [options] -
#$ -o run_$1.out
cmds
EOF

答案 1 :(得分:0)

要比接受的答案更具特定于SGE,只需重定向qsub的标准输出并解析作业ID。然后,您可以使用此选项通过qalter更改作业名称。

以下是我用来提交和修改此类工作的脚本示例。

 for a in $args;
 do 
    qsub submission_script $a 1> job.txt
    jid=$(cat job.txt | tr -dc '0-9' | cut -c -6)
    qalter $jid -N $a
 done

我确信有更多惯用的方法可以做到这一点,但这是第一次。

这种方法允许submission_script拥有自己的参数。它还允许您以编程方式更改其他作业特征,而不仅仅是名称。

答案 2 :(得分:-2)

我也在SGE中使用qsub命令生成不同的输出或错误日志。例如,如果我想在脚本中包含TASK_ID,而不是执行

#$ -o run_${TASK_ID}.out

写下它而没有这些技巧会做到这一点:

#$ -o run_$TASK_ID.out