2016-07-06 5 views
1

シェルスクリプトでコマンド置換に問題があります。私は前にこのスクリプトを別のシステムで使っていたので、ここで何が起こっているのか分かりません。どのように変数を設定するためのコマンドを囲んでいるかのように思えますが、空の変数があります。私はそれらを囲むためにさまざまな方法を試みました($()、backticks、quotes)。役立つなら、私は配列ジョブを提出しようとしています。コマンド置換の問題(変数が空です)

#!/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

他の引用符ではなくランダムに「バックテックを試してみてください」と思われる理由は何ですか?あなたはバックティックが何をするのか考えていますか?

置換の結果が空の場合は、それが変数の値だからです。あなたは出力をその変数に設定するコマンドをDEBUGGINGしようとしましたか?それとも、ターミナルで入力したのでしょうか?

-1

サンプルの値を割り当てるコマンドが正しいです。コマンドラインでも私のために働いています。 ただし、シェルスクリプトで同じものを使用しています。 だから、そのために、以下の使用してみてください: -

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

\ $ 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]"は必要ありません。

関連する問題