2017-10-09 2 views
0

私は、多数の他のスクリプトを生成する目的でスクリプトを書いています。私はforループを使用しています。これは、各スクリプトに対して必要なコードのテキストをエコーし​​、.shファイルに出力します。ここで私はそれを書いた方法です:.shファイルにエコーする

#!/bin/bash 


for i in {1..30} ; do 

echo 

"#!/bin/bash 
#$ -N DT_STAR_$i 
#$ -l mem_free=200G 
#$ -pe openmp 4 
#$ -q bio,abio,pub8i 

module load STAR/2.5.2a 


STAR --genomeDir /dfs1/bio/dtatarak/indexes/STAR_Index --readFilesIn 
DT_$i.read1.fastq DT_$i.read2.fastq --runThreadN 4 --outFileNamePrefix 
/David_data1/DT_$i" > DT_STAR_map_$i.sh 


done 

は基本的に私はそれが何をしたいのか、「」内のコードのすべての行を取るとDT_1、DT_2にDT_iを変える新しい.SHファイルにするたびにそれらを置くですDT_3などを使用しています。端末でこのスクリプトを実行すると、すべての.shファイルを作成しますが、何も入れません。引用符の内容を "No such file or directory"というメッセージとともに私の画面に表示します。私は何が間違っているのか分かりません。私がしようとしていることを達成するためのよりよい方法はありますか?

ありがとうございます!

答えて

3

echoコマンド自体から別の行にエコーするように文字列を開始することはできません。 echo行の末尾にある改行はそのコマンドを終了し、文字列はそれ自身のコマンドとして扱われて実行されます。しかし、その名前のコマンドがないので、あなたはエラーが発生します。

また、STARコマンドを複数の行に分割することはできません。

for i in {1..30} ; do 

echo "#!/bin/bash 
#$ -N DT_STAR_$i 
#$ -l mem_free=200G 
#$ -pe openmp 4 
#$ -q bio,abio,pub8i 

module load STAR/2.5.2a 

STAR --genomeDir /dfs1/bio/dtatarak/indexes/STAR_Index --readFilesIn DT_$i.read1.fastq DT_$i.read2.fastq --runThreadN 4 --outFileNamePrefix /David_data1/DT_$i" > DT_STAR_map_$i.sh 

done 

複数の行を書き込むより一般的な方法は、here-docです。

for i in {1..30} ; do 

cat <<EOF > DT_STAR_map_$i.sh 
#!/bin/bash 
#$ -N DT_STAR_$i 
#$ -l mem_free=200G 
#$ -pe openmp 4 
#$ -q bio,abio,pub8i 

module load STAR/2.5.2a 

STAR --genomeDir /dfs1/bio/dtatarak/indexes/STAR_Index --readFilesIn DT_$i.read1.fastq DT_$i.read2.fastq --runThreadN 4 --outFileNamePrefix /David_data1/DT_$i 
EOF 

done 
+0

STARコマンド自体は、自分のコードの1行として書かれています。私はこのウェブサイトのフォーマットに精通していないので、それが私のポストでそのように終わったのです。エコーコマンドが新しい行で中断されたことはわかりませんでした。ありがとう、私はそれを試してみましょう! –

+0

それはすごくうまくいった!ありがとう、私はエコー構文のその側面を認識していませんでした。 –

+0

あなたは、コマンドの最後が行末にあることに気づいていませんでしたか? – Barmar

関連する問題