2016-07-06 84 views
1

在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

[我試圖把一個命令放在一個變量中,但複雜的情況總是失敗!](http://mywiki.wooledge.org/BashFAQ/050) – fedorqui

+0

我不認爲這真的解決了這個問題...這對我來說(在不同的系統上)有效,所以不知道現在發生了什麼。 – Ethan

+0

也許'bednames.txt'是空的?從文件中獲得行'N'的更好的方法可能是'sample = $(awk -vlineno = $ {mem}'NR == lineno {print $ 2}'bednames.txt)'... – twalberg

回答

0

你爲什麼要「隨意試用反推」而不是其他引號?你知道什麼反作用力嗎?

如果替換結果爲空,那是因爲那是變量的值。您是否嘗試過調試其輸出設置該變量的命令,通過,哦,我不知道,也許是在終端上鍵入它?

-1

您分配樣本值的命令是正確的。在我的命令行上工作。 但是,您在shell腳本中使用的是相同的。 所以對於那些嘗試使用以下: -

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

\ $ 2之前。 可能發生的情況是,如果您使用的是\,則腳本會檢查第二個命令行參數。

+0

在單引號內,不需要轉義'$',這樣做實際上會導致'awk'抱怨語法錯誤。 – twalberg

0

由於您使用的是$LSB_JOBINDEX,您可能需要一個數組作業。作業名稱應包含數組的開始和結束參數。例如

#BSUB -J windowCovR1[1-100] 

這假定文件bednames.txt中有100條命令行。沒有數組邊界,$LSB_JOBINDEX將始終爲零。 head -n 0會給出空字符串。

我試過這個簡單的例子,它適用於我。

[[email protected] ~]$ 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 

[[email protected] ~]$ cat bednames.txt 
line11 line12 
line21 line22 

[[email protected] ~]$ bsub < tmp.sh 
Job <805> is submitted to queue <normal>. 

[[email protected] ~]$ cat /tmp/LOG 
7979 mem 1 
7979 line12 
7991 mem 2 
7991 line22 

另一個小問題。如果這不是一項並行工作,則不需要-R "span[hosts=1]"