命令替换问题(变量为空)

时间:2016-07-06 14:43:34

标签: linux unix lsf command-substitution

在shell脚本中使用命令替换时遇到一些问题。我之前在另一个系统上使用过这个脚本,所以不确定这里发生了什么。似乎无论我如何附上设置变量的命令,我都得到一个空变量。我已经尝试了许多不同的方法来封装它们($(),反引号,引号)。如果有帮助,我会尝试提交数组作业。

#!/bin/bash
#BSUB -q shared
#BSUB -W 23:55
#BSUB -M 51200
#BSUB -J windowCovR1
#BSUB -R "span[hosts=1]"

mem=$LSB_JOBINDEX
sample=`head -n "$mem" bednames.txt | tail -1 | awk '{print $2}'`
eval ${sample}
echo ${sample}

$mem设置正确,它是sample行的内容。 echo命令打印一个空行。

3 个答案:

答案 0 :(得分:0)

为什么你会随机而不是其他报价“反复尝试反叛”?你知道反引号有什么作用吗?

如果替换的结果为空,那是因为那是变量的值。您是否尝试过DEBUGGING其输出设置该变量的命令,哦,我不知道,也许是在终端输入?

答案 1 :(得分:0)

由于您使用的是$LSB_JOBINDEX,因此您可能需要一个数组作业。作业名称应包括数组的开始和结束参数。如,

#BSUB -J windowCovR1[1-100]

这假设文件bednames.txt中有100个命令行。如果没有数组边界,$LSB_JOBINDEX将始终为零。 head -n 0将提供空字符串。

我尝试了这个简单的例子,它对我来说没问题。

 [mclosson@host ~]$ cat tmp.sh
 #!/bin/bash
 #BSUB -q normal
 #BSUB -W 23:55
 #BSUB -M 10
 #BSUB -J windowCovR1[1-2]
 #BSUB -R "span[hosts=1]"

 mem=$LSB_JOBINDEX
 echo "$$ mem $mem" >> /tmp/LOG
 sample=`head -n "$mem" bednames.txt | tail -1 | awk '{print $2}'`
 echo "$$ ${sample}" >> /tmp/LOG

 [mclosson@host ~]$ cat bednames.txt
 line11 line12
 line21 line22

 [mclosson@host ~]$ bsub < tmp.sh
 Job <805> is submitted to queue <normal>.

 [mclosson@host ~]$ cat /tmp/LOG
 7979 mem 1
 7979 line12
 7991 mem 2
 7991 line22

另一个小问题。如果这不是并行作业,则不需要-R "span[hosts=1]"

答案 2 :(得分:-1)

分配样本值的命令是正确的。在命令行上为我工作。 但是,您在shell脚本中使用相同的内容。 因此,尝试使用以下内容: -

样品= head -n "$mem" bednames.txt | tail -1 | awk '{print \$2}'

在$ 2之前

\。 可能会发生在没有\的情况下使用时,脚本会检查第二个命令行参数。