在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
命令打印一个空行。
答案 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}'
\。 可能会发生在没有\的情况下使用时,脚本会检查第二个命令行参数。