【问题标题】:Problems with command substitution (variable is empty)命令替换问题(变量为空)
【发布时间】:2016-07-06 14:43:34
【问题描述】:

在 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 命令打印一个空行。

【问题讨论】:

  • 我认为这并不能真正解决这个问题......这对我来说以前有效(在不同的系统上),所以不确定现在发生了什么。
  • 也许bednames.txt 是空的?从文件中获取行N 的更好方法可能是sample=$(awk -vlineno=${mem} 'NR == lineno { print $2 }' bednames.txt)...
  • 它不是空的......我最终用一个不理想的循环来做这个。如果我解决这个问题会更新。

标签: linux unix lsf command-substitution


【解决方案1】:

由于您使用的是$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】:

    您“尝试[ing]反引号”的方法似乎不正确。

    如果替换的结果为空,那是因为那是变量的值。您是否尝试过通过终端调试其输出设置该变量的命令?

    【讨论】:

      【解决方案3】:

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

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

      \ 在 $2 之前。 当您不使用 \ 时,脚本可能会检查第二个命令行参数。

      【讨论】:

      • 在单引号内,不需要转义$,这样做实际上会导致awk抱怨语法错误。
      猜你喜欢
      • 2021-10-13
      • 1970-01-01
      • 2017-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-01
      • 2016-03-19
      相关资源
      最近更新 更多